'push ebp''pop ebp'未使用但在删除时仍会破坏代码。

时间:2017-09-26 02:58:21

标签: 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_add(1, 1);"时,它返回-1 所以我替换了代码,试图找出发生了什么。

"
push ebp
mov eax,[esp+0c]
add eax,[esp+08]
pop ebp
ret
"

按预期工作,返回1 + 1 = 2。 那么为什么ebp必须在开头被推送然后在结尾处弹出,如果它从未在代码中使用过?

1 个答案:

答案 0 :(得分:7)

如果不使用它,则不需要推动。

在优化代码中,您使用的是原始偏移量0c08 推送ebp时是正确的。

如果您没有推送任何内容且08仍有其原始的功能输入值,则必须分别使用04esp