Умножение с использованием сложения и сдвига: перевод с Java на MIPS - PullRequest
1 голос
/ 16 декабря 2011

Я должен написать в 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

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

Ошибка копирования на srl в конце:

srl $t1, $t1, 1
1 голос
/ 16 декабря 2011

Помимо исправления @Joop Eggen, вы должны учитывать, имеет ли место задержка ветвления или нет.Если MIPS, который вы используете, имеет ветвление с задержкой, вы должны соответствующим образом изменить свою программу.Самый простой способ - добавить инструкцию nop после ваших переходов / переходов (после двух beq и после j).

Кроме того, в конце кода вы добавляете результат($ s2) в $ a0 вместо того, чтобы перемещать его туда.

Итак, подведем итог:

  • с учетом ветвления с задержкой, т.е. добавьте nop после beq и j
  • изменить srl $t0, $t0, 1 на srl $t1, $t1, 1
  • изменить add $a0, $a0, $ s2 на add $a0, $0, $s2
0 голосов
/ 25 декабря 2016

Программа, которая умножает два целых числа, используя метод сложения и сдвига:

.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 nop $t1, $zero, END

    div $t1, $s3
    mfhi $t3 # remainder is now in register $t3

    beq nop $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 $t1, $t1, 1

    j nop LOOP # to jump back to the start of the loop

END:    
    add $a0, $0, $s2
    li $v0, 1
    syscall
...