Assembly Y86,获得ADR。不明白为什么
所以基本上在这里学习y86。我有这个C代码,我试图翻译成y86汇编。我不断地发现这个错误:Assembly Y86,获得ADR。不明白为什么,assembly,y86,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: 基本上,我正在尝试翻译这
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意味着程序试图从无效的内存地址写入或读取。
谢谢 您的堆栈似乎未正确设置,因此您需要首先初始化
ESP
,并确保函数完成后的ret
正在某个可以终止程序的地方跳转
在您的错误中,您可以看到esp=0如何准确初始化esp?它不是在我写语句时初始化的吗?
rrmovl%esp,%ebp
ebp来自哪里mov esp,ebp
是创建堆栈帧,它没有初始化任何内容。当然,您的第一个语句是push
,它已经使用了可能还不存在的堆栈。我将前两个语句原封不动地放在这里,因为在本书中,我使用了一个这样开始的代码示例。因为我不知道如何启动y86代码,所以我同意了。你必须学会使用调试器。如果你看一本书,它应该解释如何运行和调试你的代码。也许有一张CD有一个工作的样本项目?预定了一张出租的,所以没有附带一张。我通过添加一些代码来实现它。阅读本章的更多内容,并对初始化做一些研究。摆脱了ADR异常,并在寄存器和内存中获得了一些要更改的值。我最终得到了一个AOK例外。谢谢你的帮助,德夫!