Упражнение по сборке Java в Mips

У меня есть задание, в котором моя цель - перевести следующий код Java (в блоке комментариев вверху файла asm) в код сборки mips. Когда я пытаюсь скомпилировать в QTSpim, я получаю сообщение об ошибке «Попытка выполнить не-инструкцию по адресу 0x0040007c». Также я продолжаю получать сообщение об ошибке, в котором говорится, что моя основная метка была использована во второй раз в строке 36, но я не понимаю, как это возможно. Любая помощь будет оценена, спасибо.

Вот мой код:

########################################################################
# program description:
#Translate this into assembly:
#
#int w1 = 40; // use a register for this variable
#int w2 = 20; // use a register for this variable
#int total;    // use a register for this variable
#int result[4]; // note: int = 1 word = 4 bytes
#
#total = w1;
#for (int i = 0; i < 4; i++) {
#   total = total + w2;
#   if (total > 100) {
#      total = total - 100;
#   }
#   result[i] = total;
#   System.out.println(total); // C++: cout << total << '\n';
#}
#return;
#
#
# Arguments: w1, w2, total.
#
# 
#
#
########################################################################

    .data
result:     .word   4

    .text
main:
    li      $s0, 40     #w1
    li      $s1, 20     #w2
    li      $s2, 0      #total
    li      $s3, 0      #loop counter
    li      $s4, 4      #loop conditional
    li      $s5, 100    #if conditional

    add     $s2, $s2, $s0

    loop:
    beq     $s3, $s4, end   #if the counter is greater than 4, exit loop
    add     $s2, $s2, $s1   #total = total + w2
    bgt     $s2, $s5, then  #if total is greater than 100 branch to then

    then:
    sub     $s2, $s2, $s5   #total = total - 100
    sw      $s2, result     #store total into result
    li      $v0, 1          #print out total            
    move    $a0, $s2        
    syscall

    else:   
    sw      $s2, result     
    li      $v0, 1          #print out total
    move    $a0, $s2
    syscall

    end:

person Jake    schedule 16.11.2014    source источник


Ответы (1)


Вам нужно явно выйти из вашей программы после ее завершения, иначе ЦП просто продолжит выполнение всего, что находится в памяти, сразу после вашей программы. Когда вы используете SPIM (или один из других симуляторов, производных от SPIM), вы можете использовать syscall 10 для этого:

# syscall 10 == exit
li $v0,10
syscall    
person Michael    schedule 17.11.2014