2015-10-22 2 views
0

имеют проблемы со следующим кодом. Я написал код для рисования кругового круга на ассемблере MARS. Но происходит ошибка. Сама программа рисует кватер круг, но в конце концов, есть ошибка, из-за этого я не могу использовать цикл для этой процедуры, код нижеРисунок на MIPS. Ошибка выполнения

.data 
    DISPLAY: .space 65536  
    DISPLAYWIDTH: .word 128 
    DISPLAYHEIGHT: .word 128 

.text 

j main 

set_pixel_color: 

    mulu $t0 $a1 $s0 
    add $t0 $t0 $a0 
    mul $t0 $t0 4 

    la $t2 DISPLAY 
    add $t2 $t2 $t0 

    sw $a2 ($t2) 
    jr $ra   

quater_circle:    
    add $a1 $0 0 
    add $a0 $0 0 
    lw $a2 RED 

     loop2: 
       jal set_pixel_color 
      add $a0 $a0 1 
      mulu $t3 $a0 $a0 
      mulu $t4 $a1 $a1 
      add $t3 $t3 $t4 
      mulu $t4 $a3 $a3 

      ble $t3 $t4 loop2      
      add $a0 $0 $0 
      add $a1 $a1 1 

      ble $a1 $a3 loop2 
      jr $ra 

.data 
    RED: .word 0xff0000 
    GREEN: .word 0x00ff00 
    BLUE: .word  0x0000ff 
.text 

main: 
    lw $s0, DISPLAYWIDTH # s0 holds MAX x 
    lw $s1, DISPLAYHEIGHT # s1 holds MAX y 
    li $a3 1 
    lw $a2 BLUE 
    add $a0 $0 $0 
    add $a1 $0 $0 
     loop: 
      jal set_pixel_color 
      add $a0 $a0 1 
      ble $a0 127 loop 
      add $a0 $0 $0 
      add $a1 $a1 1 
      ble $a1 127 loop 
     draw: 
       jal quater_circle 
       add $a3 $a3 1 
       ble $a3 128 draw 

Она заканчивается с нарисованной красной кватера кругом с синий, но он заканчивается в конце процедуры, и я не могу использовать процедуру draw. Не могли бы вы мне помочь?

ответ

0

Вы теряете $ra в своей quater_circle подпрограмма. Эта процедура вызывается из main, и она вызывает другую подпрограмму (set_pixel_color), теряя при этом исходный адрес возврата.

Вы должны сохранить $ra в вашем quater_circle подпрограммы, сохраняя его содержимое в стек (и восстановить его, прежде чем вернуться к абоненту) или же перемещение $ra в какой-то другой регистр (например, $s2) и использовать его для возврата.

Для второго варианта, можно добавить

move $s2, $ra 

в начале quater_circle подпрограммой и изменить

jr $ra 

с

jr $s2 

в конце подпрограммы ,

+0

Спасибо, это очень помогло!) –

Смежные вопросы