Меня попросили реализовать вычитание 64-битных чисел в Mips, при этом числа задаются в дополнении до 2, а младшие/верхние 32 бита хранятся в разных регистрах. Мои мысли: сначала вычитаем нижние части, а потом верхние. Проблемная ситуация возникает, если младший номер части первого числа меньше, чем у второго числа, т.е. при рассмотрении небольшого примера, где у нас есть только 4-битные регистры.
0110 0011
-0010 1000
Итак, сначала нижняя часть
0000 0011 0000 0011
-0000 1000 = +1111 1000 = 1111 1011
а потом верхняя часть
0110 0000 0110 0000
-0010 0000 = +1110 0000 = 0100 0000
а затем сложить две части вместе
0100 0000
+1111 1011 = 0011 1011
Тогда моя реализация Mips будет выглядеть примерно так (для простоты регистры 1-8):
// A-B
lw $1, 0($8) // upper part of A
lw $2, 4($8) // lower part of A
lw $3, 8($8) // upper part of B
lw $4, 12($8) // lower part of B
subu $5, $2, $4
stlu $6, $2, $4 // if lower part of A < lower part of B we need to add 1111 0000 i.e.
// subtract 1 from upper part result
subu $7, $1, $3
subu $7, $7, $6
// Now the upper part of the result is stored in $7$ and the lower part in $5
Моя мысль кажется правильной?