Cat*_*des 1 x86 assembly arguments
我编译:
"
int x_add(int a, int b)
{
return a+b;
}
"
Run Code Online (Sandbox Code Playgroud)
得到了
"
push ebp
mov ebp,esp
mov edx,[ebp+08]
mov eax,[ebp+0c]
pop ebp
ret
"
Run Code Online (Sandbox Code Playgroud)
我将组件简化为
"
mov eax,[esp+0c]
add eax,[esp+08]
ret
"
Run Code Online (Sandbox Code Playgroud)
当我运行"x_add(1, 1);"
它返回-1所以我替换代码试图找出什么破坏.
"
push ebp
mov eax,[esp+0c]
add eax,[esp+08]
pop ebp
ret
"
Run Code Online (Sandbox Code Playgroud)
按预期工作,返回1 + 1 = 2.那么为什么ebp必须在开始时被推送然后如果从未在代码中使用过那么会弹出?
如果没有使用它就不需要推动.
在优化的代码中,您使用的是原始偏移量0c
,08
并且在ebp
推送时是正确的.
当你没有按任何东西并且仍然有其原始的函数入口值时,你必须分别使用08
和.04
esp