从汇编的角度看函数调用的过程

从汇编的角度看函数调用的过程

ID:39547285

大小:38.50 KB

页数:3页

时间:2019-07-06

从汇编的角度看函数调用的过程_第1页
从汇编的角度看函数调用的过程_第2页
从汇编的角度看函数调用的过程_第3页
资源描述:

《从汇编的角度看函数调用的过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、从汇编的角度看函数调用的过程有时候,我们需要深入了解编程语言的一些细节性问题,比如,编程语言结构--函数是如何实现的,函数的执行会是怎么样的一个过程。下面我们举一个例子,看看函数调用的时候,堆栈会发生怎么样的变化。#includelongtest(inta,intb){a=a+1;b=b+100;returna+b;}voidmain(){printf("%d",test(1000,2000));}写成32位汇编就是这样:;//////////////////////////////////////////////

2、////////////////////////////////////////////////////////.386.modelflat,stdcall;这里我们用stdcall就是函数参数压栈的时候从最后一个开始压,和被调用函数负责清栈optioncasemap:none;区分大小写includelibmsvcrt.lib;这里是引入类库相当于#include了printfPROTOC:DWORD,:VARARG;这个就是声明一下我们要用的函数头,到时候汇编程序会自动到msvcrt.lib里面找的了;:VAR

3、ARG表后面的参数不确定因为C就是这样的printf(constchar*,...);;这样的函数要注意不是被调用函数负责清栈因为它本身不知道有多少个参数;而是有调用者负责清栈下面会详细说明.dataszTextFmtBYTE'%d',0;这个是用来类型转换的,跟C的一样,字符用字节类型adword1000;假设bdword2000;处理数值都用双字没有int跟long的区别;///////////////////////////////////////////////////////////////////////////////

4、//////////.code_testproc;A:DWORD,B:DWORDpushebpmovebp,espmoveax,dwordptrss:[ebp+8]addeax,1movedx,dwordptrss:[ebp+0Ch]addedx,100addeax,edxpopebpretn8_testendp_mainprocpushdwordptrds:b;反汇编我们看到的b就不是b了而是一个[*****]数字dwordptr就是我们在ds(数据段)把[*****];开始的一个双字长数值取出来pushdwordptrds:a;

5、跟她对应的还有byteptr****就是取一个字节出来比如这样moval,byteptrds:szTextFmt;就把%取出来而不包括dcall_testpusheax;假设pusheax的地址是×××××pushoffsetszTextFmtcallprintfaddesp,8ret_mainendpend_main;//////////////////////////////////////////////////////////////下面介绍堆栈的变化首先要明白的是操作堆栈段,ss只能用esp或ebp寄存

6、器其他的寄存器eaxebxedx等都不能够用。而esp永远指向堆栈栈顶,ebp用来在堆栈段里面寻址。push指令是压栈ESP=ESP-4,pop指令是出栈ESP=ESP+4。我们假设main函数一开始堆栈定是ESP=400。pushdwordptrds:b;ESP-4=396->里面的值就是2000就是b的数值pushdwordptrds:a;ESP-4=392->里面的值就是1000就是a的数值calltest;ESP-4=388->里面的数值是什么?这个太重要了就是我们用来找游戏函数的原理所在。里面的数值就是calltest指令

7、下一条指令的地址->即pusheax的地址×××××到了test函数里面pushebp;ESP-4=384->里面保存了当前ebp的值而不是把ebp清零movebp,esp;这里ESP=384就没变化了,但是ebp=esp=384,为什么要这样做呢因为我们要用ebp到堆栈里面找参数moveax,dwordptrss:[ebp+8];反汇编是这样的想想为什么a就是[ebp+8]呢;我们往上看看堆栈里地址392处就保存着a的值这里ebp=384加上8正好就是392了;这样就把传递过来的1000拿了出来eax=1000addeax,1;相

8、当于a+1了eax=1001movedx,dwordptrss:[ebp+0Ch];0Ch=12一样道理这里指向堆栈的地址是384+12=396就是2000了edx=2000addedx,100;相当于b+100edx=2100add

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。