Я должен написать в MIPS программу, которая умножает два числа, используя метод сложения и сдвига. После многократных попыток я получил программу, которая, как я вижу, должна работать, но это не так, тогда я написал ее на Java, а код работал на Java. Затем я попытался преобразовать его из Java в MIPS (обычно мне проще переводить на язык низкого уровня из кода на языке высокого уровня), и после перевода он все еще не работает. Вот код, который я написал, и, пожалуйста, если кто-то обнаружит что-то с ними не так или знает, как их исправить, пожалуйста, сообщите мне.
Спасибо
В Java:
static int prod = 0;
public static int mult (int mcand, int mier)
{
while (mier != 0)
{
int rem = mier % 2;
if (rem != 0)
{
prod += mcand;
}
mcand = mcand << 1;
mier = mier >> 1;
}
return prod;
}
В MIPS:
# A program that multiplies two integers using the add and shift method
.data # Data declaration section
.text
main: # Start of code section
li $s0, 72 # the multiplicand
li $t0, 72 # the multiplicand in a temporary register
li $s1, 4 # the multiplier
li $t1, 4 # the multiplier in a temporary register
li $s2, 0 # the product
li $s3, 2 # the number 2 in a register for dividing by 2 always for checking if even or odd
LOOP: # first we check if the multiplier is zero or not
beq $t1, $zero, END
div $t1, $s3
mfhi $t3 # remainder is now in register $t3
beq $t3, $zero, CONTINUE # if the current digit is 0, then no need to add just go the shifting part
add $s2, $s2, $t0 # the adding of the multiplicand to the product
CONTINUE: # to do the shifting after either adding or not the multiplicand to the product
sll $t0, $t0, 1
srl $t0, $t0, 1
j LOOP # to jump back to the start of the loop
END:
add $a0, $a0, $s2
li $v0, 1
syscall
# END OF PROGRAM