C в MIPS Проблема перевода кода с вложенной процедурой - PullRequest
0 голосов
/ 15 апреля 2020

Мне нужно перевести кусок C кода

int main(){
int a, b, result;
if(a == b)
result = a*b;
else
result = assess(a, b);
return result;
}
int assess(int a, int b){
if(b<a)
return upgrade(a, b);
else
return demote(a, b);
}
int upgrade(int a, int b)
{return 4*(a+b);}
int demote(int a, int b)
{return 4*(b-a);}

a и b будет проверено на a = 8 b = 8 a = 3 b = 5 a = 5 b = 3 вот что я пытался


.text
main:
    add $s0,$s0,5
    add $s1,$s1,3
    add $s3,$s3,0
    beq $s0,$s1,Resultmul
    bne $s0,$s1,assess
    li $v0, 10
    syscall
assess:
    addi $sp,$sp,-8
    sw $s3,0($sp)
    sw $ra,4($sp)
    jal upgrade
    lw $ra,4($sp)
    add $sp,$sp,4
    jr $ra
Resultmul :
    mul $s3,$s1,$s0
    li $v0, 10
    syscall

upgrade:
    add $s3,$s0,$s1
    mul $s3,$s3,4
    jr $ra

demote:
    sub $v0,$s1,$s0
    mul $v0,$v0,4
    jr $ra

Но это застревает в jr $ ra в процедуре оценки, может кто-то решить эту проблему, которая была бы замечательно.

1 Ответ

0 голосов
/ 16 апреля 2020

Вы переходите на assess вместо вызова его как функции через jal. Таким образом, нет правильного значения в $ra при входе в assess, чтобы использовать его после завершения, чтобы вернуться к main.

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

Вы должны вытолкнуть из стека столько байтов, сколько вы sh - вы нажимаете 8, но выдает только 4.

Вы также не восстанавливаете $s3, хотя сохраняете его.

Вы можете рассматривать $ra как параметр, передаваемый в функцию, и проверьте ее значение при входе в функцию и во время выполнения функции, чтобы увидеть, где становится неправильным. Значение, передаваемое вызывающему, должно быть адресом точки возврата вызывающего абонента - адресом кода.

...