Y86, получение ADR. Не понимаю почему

Так что в основном я учусь здесь. У меня есть этот код C, и я пытаюсь перевести на Y86 сборки. Я продолжаю получать эту ошибку:

PC = 0x2058a090, Invalid instruciton address
Stopped in 2 steps at PC = 0x2058a090. Exception 'ADR', CC Z=1, S=0, O=0
Changes to registers:
%esp: 0x00000000    0x00000004

changes to memory:

И в основном я пытаюсь перевести этот код C:

int main(){
int i, j;
i = 0;
j = 0;

if(i>j){
    i=i+5;
}
else{
    i = 0;
    j++;
}
}

Для кода Y86:

main:
pushl %ebp
rrmovl %esp, %ebp
mrmovl 2(%ebp), %esi                #esi = 1
mrmovl 4(%ebp), %ecx                #ecx = i
mrmovl 8(%ebp), %edx                #edx = j
mrmovl 12(%ebp), %ebx               #ebx = 5
irmovl $1, %esi
irmovl $0, %ecx                 # i = 0 (ecx) 
irmovl $0, %edx                 # j = 0 (edx
irmovl $5, %ebx                     
subl %edx, %ecx
irmovl $0, %ecx
jg L4

L2:      #else statement
irmovl $0, %ecx                 #i = 0
addl %esi, %edx 
rmmovl %edx, 8(%ebp)                #new value of j to j memory
rmmovl %ecx, 4(%ebp)                #new value of i to i memory
je End


L4:      #if statement
addl %ebx, %ecx                 #add 5(ebx) to i(ecx)
rmmovl %ecx, 4(%ebp)                #assign new value of i
je End

End:
rrmovl %ebp, %esp
popl %ebp
ret

Кто-нибудь может сказать мне, откуда исходит ошибка? Я знаю, что ADR означает, что программа пытается записать или прочитать с неверного адреса памяти. Спасибо!

1 ответ

Решение

Кажется, ваш стек не правильно настроен, поэтому вам нужно инициализировать ESP и убедитесь, что ret после завершения функции происходит переход, который может прервать выполнение программы.

В вашей ошибке вы можете увидеть, что esp = 0

Другие вопросы по тегам