10分钟教你如何用VC编程来学汇编
小标 2018-08-14 来源 : 阅读 1793 评论 0

摘要:本文主要向大家介绍了10分钟教你如何用VC编程来学汇编,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了10分钟教你如何用VC编程来学汇编,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

我采用了对照的方法来学习汇编,也就是通过查看VC中的代码对应的汇编程序的执行来分析。

如下是一段简单的VC中的C语言:


#include"stdio.h"int gt(int a,int b){ return a+b;}int main(){ int x=12; int y=1; int c=gt(x,y); int z=0; return 0;}

如上述代码,很简单,就是在主函数里声明了几个变量,然后调用了一个相加函数,相加函数返回和。


那么我们一步步分析这段函数对应的汇编代码。


0040D4A1   mov         eax,0CCCCCCCCh0040D4A6   rep stos    dword ptr [edi]
//从这里开始程序代码8:        int x=12;0040D4A8   mov         dword ptr [ebp-4],0Ch   <span> </span>//int x=12的汇编 其中ebp是帧指针,指向栈活动空间的底部,表示该活动空间从这里开始
<span> </span>//其中ebp-4就是变量x。在这里我们可以看到局部变量是放在栈上的,因此可以用
<span> </span>//ebp直接访问到9:        int y=1;0040D4AF   mov         dword ptr [ebp-8],1<span> </span>//同上分析10:       int c=gt(x,y);0040D4B6   mov         eax,dword ptr [ebp-8]<span> </span>//把y的值先付给通用寄存器eax0040D4B9   push        eax<span> </span>//eax的值入栈  这里为什么不直接把变量y入栈?因为push操作数只支持寄存器
<span> </span>//注意,这里先入栈的是变量y的值<span> </span>0040D4BA   mov         ecx,dword ptr [ebp-4]<span> </span>//同上,将x的值压入栈。这里可以说明,参数入栈是从右往左0040D4BD   push        ecx0040D4BE   call        @ILT+5(gt) (0040100a)<span> </span>//调用函数0040D4C3   add         esp,8<span> </span>//esp是栈指针,子函数在这里返回0040D4C6   mov         dword ptr [ebp-0Ch],eax<span> </span>//eax存放了函数的返回值,将返回值赋给变量c11:       int z=0;0040D4C9   mov         dword ptr [ebp-10h],012:       return 0;0040D4D0   xor         eax,eax13:   }
//程序代码结束处0040D4D2   pop         edi


我们继续分析调用的子函数部分


1:    #include"stdio.h"2:    int gt(int a,int b)3:    {00401010   push        ebp<span> </span>//首先把旧的ebp入栈00401011   mov         ebp,esp<span> </span>//然后把栈指针的值赋给ebp,ebp表示指向了新的栈活动空间00401013   sub         esp,40h<span> </span>//esp的值减去40h,表示栈指针往下移动40h字节00401016   push        ebx<span> </span>ebx的值入栈00401017   push        esi<span> </span>esi的值入栈00401018   push        edi<span> </span>edi的值入栈00401019   lea         edi,[ebp-40h]0040101C   mov         ecx,10h00401021   mov         eax,0CCCCCCCCh00401026   rep stos    dword ptr [edi]4:        return a+b;00401028   mov         eax,dword ptr [ebp+8] //参数a的值赋给eax寄存器0040102B   add         eax,dword ptr [ebp+0Ch]//将eax的寄存器的值和参数b的值相加,并且放到eax   注意,eax寄存器作为存放函数返回值使用5:    }0040102E   pop         edi

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 1
看完这篇文章有何感觉?已经有2人表态,50%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved