Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Y86,获得ADR。不明白为什么_Assembly_Y86 - Fatal编程技术网

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

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: 基本上,我正在尝试翻译这

所以基本上在这里学习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意味着程序试图从无效的内存地址写入或读取。
谢谢

您的堆栈似乎未正确设置,因此您需要首先初始化
ESP
,并确保函数完成后的
ret
正在某个可以终止程序的地方跳转


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

如何准确初始化esp?它不是在我写语句时初始化的吗?
rrmovl%esp,%ebp
ebp来自哪里
mov esp,ebp
是创建堆栈帧,它没有初始化任何内容。当然,您的第一个语句是
push
,它已经使用了可能还不存在的堆栈。我将前两个语句原封不动地放在这里,因为在本书中,我使用了一个这样开始的代码示例。因为我不知道如何启动y86代码,所以我同意了。你必须学会使用调试器。如果你看一本书,它应该解释如何运行和调试你的代码。也许有一张CD有一个工作的样本项目?预定了一张出租的,所以没有附带一张。我通过添加一些代码来实现它。阅读本章的更多内容,并对初始化做一些研究。摆脱了ADR异常,并在寄存器和内存中获得了一些要更改的值。我最终得到了一个AOK例外。谢谢你的帮助,德夫!