Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 “push ebp”“pop ebp”未使用,但删除后仍会中断代码。_Assembly_X86_Arguments - Fatal编程技术网

Assembly “push ebp”“pop ebp”未使用,但删除后仍会中断代码。

Assembly “push ebp”“pop ebp”未使用,但删除后仍会中断代码。,assembly,x86,arguments,Assembly,X86,Arguments,我汇编: " int x_add(int a, int b) { return a+b; } " 得到 " push ebp mov ebp,esp mov edx,[ebp+08] mov eax,[ebp+0c] pop ebp ret " 我把装配简化为 " mov eax,[esp+0c] add eax,[esp+08] ret " 当我运行x_add1时,1;它返回-1 所以我更换了代码,试图找出是什么坏了 " push ebp mov eax,[esp+0c] add

我汇编:

"
int x_add(int a, int b)
{
    return a+b;
}
"
得到

"
push ebp
mov ebp,esp
mov edx,[ebp+08]
mov eax,[ebp+0c]
pop ebp
ret
"
我把装配简化为

"
mov eax,[esp+0c]
add eax,[esp+08]
ret
"
当我运行x_add1时,1;它返回-1 所以我更换了代码,试图找出是什么坏了

"
push ebp
mov eax,[esp+0c]
add eax,[esp+08]
pop ebp
ret
"
按预期工作,返回1+1=2。
那么,如果代码中从未使用过ebp,为什么ebp必须在开始时推送,然后在结束时弹出?

如果未使用ebp,则不需要推送

在优化的代码中,使用的是原始偏移量0c和08 按下ebp时,测试结果是正确的


当您没有按下任何键,且esp仍有其原始功能输入值时,必须分别使用08和04。

如果未使用,则不需要按下

在优化的代码中,使用的是原始偏移量0c和08 按下ebp时,测试结果是正确的


当您没有按下任何键,且esp仍有其原始函数输入值时,必须分别使用08和04。

So。。如果没有push/pop,您没有注意到esp的值,因此用于寻址的偏移量与push/pop不同,对吗?是的,以交互方式调试,对吗?短版本:push ebp修改esp,所以如果你删除push/pop,你也必须调整你的偏移量。是的,对调试器来说有点新。IDA很容易出错,当我打断代码时,代码块会跳过代码。我使用的是作弊引擎,没有想过要检查堆栈指针。如果你在编译代码时启用了优化,它会更简单,更容易理解。谢谢Cody。我正在学习x86,下一步就要尝试,看看我的优化代码和g++输出之间的区别。基本上,分析从禁用优化的编译器中获得的调试代码是浪费时间。这里有很多噪音,还有很多没有意义的东西。这不是学习/理解汇编语言的好方法。所以如果没有push/pop,您没有注意到esp的值,因此用于寻址的偏移量与push/pop不同,对吗?是的,以交互方式调试,对吗?短版本:push ebp修改esp,所以如果你删除push/pop,你也必须调整你的偏移量。是的,对调试器来说有点新。IDA很容易出错,当我打断代码时,代码块会跳过代码。我使用的是作弊引擎,没有想过要检查堆栈指针。如果你在编译代码时启用了优化,它会更简单,更容易理解。谢谢Cody。我正在学习x86,下一步就要尝试,看看我的优化代码和g++输出之间的区别。基本上,分析从禁用优化的编译器中获得的调试代码是浪费时间。这里有很多噪音,还有很多没有意义的东西。这不是学习/理解汇编语言的好方法。