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