《C语言指针与汇编语言地址.ppt》由会员分享,可在线阅读,更多相关《C语言指针与汇编语言地址.ppt(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C C语言指针与汇编语言地址语言指针与汇编语言地址语言指针与汇编语言地址语言指针与汇编语言地址zhao4zhong1(zhao4zhong1(赵中赵中)教学计划教学计划第第1次课:次课:演示使用演示使用VC2010查看每句查看每句C对应的汇编指令对应的汇编指令和每个和每个C语言成分对应的汇编地址或寄存器。语言成分对应的汇编地址或寄存器。第第2次课:次课:通过通过求函数大小求函数大小功能和功能和求函数调用者求函数调用者实例了解指针与函数对应的汇编内存地址。实例了解指针与函数对应的汇编内存地址。第第3、4次课:次课:通过通过静态和动态一、二、三维数组静态和动态一、二、三维数组实例了解指针与数组对应
2、的汇编内存地址。实例了解指针与数组对应的汇编内存地址。第第5、6次课:次课:通过通过带头节点和不带头节点的单链表带头节点和不带头节点的单链表实例了解指针与单链表对应的汇编内存地址。实例了解指针与单链表对应的汇编内存地址。第第7、8次课:次课:通过通过双向链表和双向循环链表双向链表和双向循环链表实例了解指针与双向链表对应的汇编内存地址。实例了解指针与双向链表对应的汇编内存地址。第第9、10次课:通过次课:通过十字链表十字链表实例了解指针与十字链表对应的汇编内存地址。实例了解指针与十字链表对应的汇编内存地址。求函数大小和求函数调用者求函数大小和求函数调用者文件、新建、项目文件、新建、项目Win32
3、 控制台应用程序控制台应用程序名称:名称:prj1位置:位置:d:prjzz解决方案名称:解决方案名称:prj1确定确定下一步下一步空项目空项目完成完成项目、属性、配置属性、项目、属性、配置属性、C/C+、预编译头、预编译头:不使用预编译头、预编译头、预编译头:不使用预编译头项目、属性、配置属性、项目、属性、配置属性、C/C+、代码生成、基本运行时检查:默认值、代码生成、基本运行时检查:默认值项目、属性、配置属性、链接器、高级、随机基址:否项目、属性、配置属性、链接器、高级、随机基址:否求函数大小和求函数调用者求函数大小和求函数调用者 单步执行单步执行F11寄存器窗口寄存器窗口Alt+5汇编窗
4、口汇编窗口Alt+8内存内存2 窗口窗口Ctrl+Alt+M,2内存内存1 窗口窗口Alt+6求函数大小求函数大小#include void fun1()int f1=1;printf(fun1n);printf(fun1n);void fun2()int f2=2;printf(fun2n);void fun3()int main()#ifdef _DEBUG printf(sizeof(fun1)=%dn,(int)fun2+5+*(int*)(int)fun2+1)-(int)fun1+5+*(int*)(int)fun1+1);printf(sizeof(fun2)=%dn,(int)
5、fun3+5+*(int*)(int)fun3+1)-(int)fun2+5+*(int*)(int)fun2+1);#else printf(sizeof(fun1)=%dn,(int)fun2-(int)fun1);printf(sizeof(fun2)=%dn,(int)fun3-(int)fun2);#endif return 0;F11、Alt+8、在反汇编窗口中点鼠标右键,勾选显示代码字节、在反汇编窗口中点鼠标右键,勾选显示代码字节鼠标右键点源文件、添加、现有项、鼠标右键点源文件、添加、现有项、d:prjzzprj1prj1sizeoffun.c、添加、添加在在sizeoffun.
6、c上双击鼠标左键上双击鼠标左键求函数大小(求函数大小(Debug)代码要素代码要素对应内存地址对应内存地址字节字节含义含义入口函数main 41130055push ebp_fun2411109e9 a2 01 00 00Jmp fun2fun24112b055push ebp_fun1411104e9 67 01 00 00Jmp fun1fun141127055push ebp_fun341110ee9 cd 01 00 00Jmp fun3fun34112e055push ebpsize of fun140fun2-fun1size of fun230fun3-fun2求函数大小求函数大
7、小解决方案配置:解决方案配置:Release项目、属性、配置属性、项目、属性、配置属性、C/C+、预编译头、预编译头:不使用预编译头、预编译头、预编译头:不使用预编译头项目、属性、配置属性、项目、属性、配置属性、C/C+、代码生成、基本运行时检查:默认值、代码生成、基本运行时检查:默认值项目、属性、配置属性、链接器、高级、随机基址:否项目、属性、配置属性、链接器、高级、随机基址:否求函数大小(求函数大小(Release)代码要素代码要素对应内存地址对应内存地址字节字节含义含义入口函数main 40104056push esifun240102056push esifun140100056pus
8、h esifun3401030c3retsize of fun120fun2-fun1size of fun210fun3-fun2求函数调用者求函数调用者#include void whocallme();void fun1()printf(in fun1n);whocallme();void fun2()printf(in fun2n);whocallme();void fun3()void whocallme()int*_ebp;_asm mov eax,ebp mov _ebp,eax#ifdef _DEBUG printf(nfun1,fun2,fun3,_ebp=%08x,%08x
9、,%08x,%08xn,(int)fun1+5+*(int*)(int)fun1+1),(int)fun2+5+*(int*)(int)fun2+1),(int)fun3+5+*(int*)(int)fun3+1),(int)_ebp);#else printf(nfun1,fun2,fun3,_ebp=%08x,%08x,%08x,%08xn,(int)fun1,(int)fun2,(int)fun3,(int)_ebp);#endif printf(ret addr=%08xn,_ebp1);#ifdef _DEBUG if(int)fun1+5+*(int*)(int)fun1+1)=_
10、ebp1&_ebp1(int)fun2+5+*(int*)(int)fun2+1)printf(fun1 callmen);if(int)fun2+5+*(int*)(int)fun2+1)=_ebp1&_ebp1(int)fun3+5+*(int*)(int)fun3+1)printf(fun2 callmen);#else if(int)fun1=_ebp1&_ebp1(int)fun2)printf(fun1 callmen);if(int)fun2=_ebp1&_ebp1(int)fun3)printf(fun2 callmen);#endifint main()fun2();fun1
11、();return 0;解决方案配置:解决方案配置:Debug、F11、Alt+8、在反汇编窗口中点鼠标右键,勾选显示代码字节、在反汇编窗口中点鼠标右键,勾选显示代码字节鼠标右键点鼠标右键点sizeoffun.c、选移除、在弹出的对话框中点移除。、选移除、在弹出的对话框中点移除。鼠标右键点源文件、添加、现有项、鼠标右键点源文件、添加、现有项、d:prjzzprj1prj1whocallme.c、添加、添加在在whocallme.c上双击鼠标左键上双击鼠标左键求函数调用者(求函数调用者(Debug)代码要素代码要素对应内存地址对应内存地址字节字节含义含义入口函数main 41143055push
12、 ebpfun24112b055push ebpwhocallme41130055push ebp_ebp12fe8488 fe 12 00进入函数时ebp寄存器的值_ebp112fe8ccc 12 41 00栈底的返回地址4112ccfun141128055push ebpfun34112e055push ebp求函数调用者(求函数调用者(Release)代码要素代码要素对应内存地址对应内存地址 字节字节含义含义入口函数main4010e055push ebpfun240102055push ebpwhocallme40105055push ebp_ebp12ff3034 ff 12 00进入函数时ebp寄存器的值_ebp112ff3836 10 40 00栈底的返回地址401036fun140100055push ebpfun340104055push ebp项目、属性、配置属性、项目、属性、配置属性、C/C+、优化:已禁用、优化:已禁用(/Od)Thank You!