首页 / C语言 / C语言的main函数反汇编笔记
C语言的main函数反汇编笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言的main函数反汇编笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3000字,纯文字阅读大概需要5分钟。
内容图文
阅读本文需要一点汇编语言的基础知识
#include <stdio.h>
int main(void)
{
return 0;
}
将这段C语言代码在VS2019下进行反汇编后:
?
#include <stdio.h>
int main(void)
{
008B4370 push ebp
008B4371 mov ebp,esp
008B4373 sub esp,0C0h
008B4379 push ebx
008B437A push esi
008B437B push edi
008B437C lea edi,[ebp-0C0h]
008B4382 mov ecx,30h
008B4387 mov eax,0CCCCCCCCh
008B438C rep stos dword ptr es:[edi]
008B438E mov ecx,offset _04D15DCE_C语言模板@c (08BC003h)
008B4393 call @__CheckForDebuggerJustMyCode@4 (08B1307h)
return 0;
008B4398 xor eax,eax
}
008B439A pop edi
008B439B pop esi
008B439C pop ebx
008B439D add esp,0C0h
008B43A3 cmp ebp,esp
008B43A5 call __RTC_CheckEsp (08B1230h)
008B43AA mov esp,ebp
008B43AC pop ebp
008B43AD ret
下面对这段汇编代码进行分析:
008B4370 push ebp
008B4371 mov ebp,esp
这两段代码叫做函数序言,每次进入函数时都要写这两段代码。将ebp压入栈中是为了对函数在栈中的空间建立起始点,而将esp的地址复制给ebp则是让ebp指向栈顶(ebp在压入栈前指向的地址是未知的),并且ebp在整个函数的运行中地址都不会改变。而esp则相反,只要有变量或寄存器压入栈中其指向的地址值都会改变。
008B4373 sub esp,0C0h
将esp的地址向下减少C0(十进制的192),这是为了给函数中的局部变量提供空间(这部分空间也叫栈帧)
008B4379 push ebx
008B437A push esi
008B437B push edi
将ebx,esi,edi压入栈中
008B437C lea edi,[ebp-0C0h]
008B4382 mov ecx,30h
008B4387 mov eax,0CCCCCCCCh
008B438C rep stos dword ptr es:[edi]
edi指向[ebp-0C0h]地址所在的空间(这里为什么不是上面的esp-0C0h呢?因为esp的地址发生了改变,如果用esp的话函数在运行时可能会出错。0C0h十进制为192)。
ecx被赋值30(10进制48),eax被赋值CCCCCCCC(10进制3435973836)。
rep stos是一个循环语句,计数器由ecx负责,rep执行循环的条件是ecx不为0,且每进行一次循环ecx都会减1;stos意为将eax的内容填充edi所指向空间中,如果配合rep的话会根据系统的位数来确定地址的增长数(在32位系统中,地址的增长或减小单位都是4个字节,64位系统中为8个字节),从而做到对多个空间进行填充。
若将ebp的地址看做是0,会发现在循环结束后由最开始的那三段代码所分配的栈空间,刚好填充满。48 * 4 = 192
008B4398 xor eax,eax
将eax归0,并将eax的值返回。main函数与一般的函数区别不是很大,基本上C语言函数在调用前一般都会将eax、ecx、edx这三个寄存器中的某一个压入栈中,这是是因为这三个寄存器由调用方保存,压栈的目的是防止值在调用函数后被修改。
008B439A pop edi
008B439B pop esi
008B439C pop ebx
栈是一种数据结构,遵循“先进后出”原则,由于这三个寄存器是最后入栈的那么理应最先出栈,且edi最先出栈。
008B439D add esp,0C0h
esp地址+C0,将栈帧空间进行清除
008B43AA mov esp,ebp
008B43AC pop ebp
008B43AD ret
最后这三段代码叫做函数尾声,每个函数在结束后也都要写这三段代码。这里的esp指向ebp,并返回到函数调用处
内容总结
以上是互联网集市为您收集整理的C语言的main函数反汇编笔记全部内容,希望文章能够帮你解决C语言的main函数反汇编笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。