1. 程序源代码(C)
int main()
{
return 0;
}
2. 使用 Visual Studio 2017 查看对应的汇编代码
int main()
{
01181A70 push ebp // 保存调用者(上一个函数)的 EBP(栈底)
01181A71 mov ebp,esp // 设置被调用者(main函数)的 EBP
01181A73 sub esp,0C0h // 开辟一块大小为C0的栈空间给调用者
01181A79 push ebx
01181A7A push esi
01181A7B push edi // 按照惯例保存调用者的三个寄存器
01181A7C lea edi,[ebp-0C0h] // 获取为被调用者局部变量预留的栈空间首地址
01181A82 mov ecx,30h // 预留空间为 C0 Byte ,每次写入4个字节,所以C0/4=30
01181A87 mov eax,0CCCCCCCCh // 0xCC即烫,对应指令 int 3(软中断)
01181A8C rep stos dword ptr es:[edi] // 初始化为被调用者局部变量预留的栈空间
return 0;
01181A8E xor eax,eax // 相关于 mov eax,0
}
01181A90 pop edi
01181A91 pop esi
01181A92 pop ebx // 还原调用者三个寄存器
01181A93 mov esp,ebp // 还原调用者的 ESP (栈顶)
01181A95 pop ebp
01181A96 ret
3. 汇编指令
mov eax,0CCCCCCCCh // 将立即数 0xCCCCCCCC 放入到寄存器 EAX 中
参考资料:《逆向工程入门指南》 《天书夜读-从汇编语言到Windows内核编程》