C语言指针与汇编语言地址.ppt
C语言指针与汇编语言地址,zhao4zhong1(赵中),教学计划,第1次课:演示使用VC2010查看每句C对应的汇编指令和每个C语言成分对应的汇编地址或寄存器。第2次课:通过求函数大小功能和求函数调用者实例了解指针与函数对应的汇编内存地址。第3、4次课:通过静态和动态一、二、三维数组实例了解指针与数组对应的汇编内存地址。第5、6次课:通过带头节点和不带头节点的单链表实例了解指针与单链表对应的汇编内存地址。第7、8次课:通过双向链表和双向循环链表实例了解指针与双向链表对应的汇编内存地址。第9、10次课:通过十字链表实例了解指针与十字链表对应的汇编内存地址。,求函数大小和求函数调用者,文件、新建、项目Win32 控制台应用程序名称:prj1位置:d:prjzz解决方案名称:prj1确定下一步空项目完成项目、属性、配置属性、C/C+、预编译头、预编译头:不使用预编译头项目、属性、配置属性、C/C+、代码生成、基本运行时检查:默认值项目、属性、配置属性、链接器、高级、随机基址:否,求函数大小和求函数调用者,单步执行F11,寄存器窗口,Alt+5,汇编窗口,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)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.c上双击鼠标左键,求函数大小(Debug),求函数大小,解决方案配置:Release项目、属性、配置属性、C/C+、预编译头、预编译头:不使用预编译头项目、属性、配置属性、C/C+、代码生成、基本运行时检查:默认值项目、属性、配置属性、链接器、高级、随机基址:否,求函数大小(Release),求函数调用者,#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,%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)=_ebp1,解决方案配置:Debug、F11、Alt+8、在反汇编窗口中点鼠标右键,勾选显示代码字节,鼠标右键点sizeoffun.c、选移除、在弹出的对话框中点移除。鼠标右键点源文件、添加、现有项、d:prjzzprj1prj1whocallme.c、添加在whocallme.c上双击鼠标左键,求函数调用者(Debug),求函数调用者(Release),项目、属性、配置属性、C/C+、优化:已禁用(/Od),Thank You!,