Y86,获得ADR。不明白为什么

时间:2014-04-11 07:21:57

标签: assembly y86

所以基本上在这里学习y86。我有这个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 个答案:

答案 0 :(得分:0)

看起来您的堆栈设置不正确,因此您需要首先初始化ESP并确保函数完成后ret正在跳转,这可能会终止程序。

在您的错误中,您可以看到esp = 0