汇编语言_第十章_Windows汇编程序设计基础.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:49 大小:310KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

汇编语言_第十章_Windows汇编程序设计基础.ppt

汇编语言_第十章_Windows汇编程序设计基础.ppt

预览

免费试读已结束,剩余 39 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第十章Windows汇编语言程序设计基础10.1Windows汇编环境10.2Windows下的子程序设计与函数调用10.3使用VC编译调试汇编程序10.1Windows汇编环境10.1.1Windows下的MASM与LINK1.MASM汇编器2.LINK链接器以一个源程序文件hello.asm为例,对它进行汇编链接,最后运行。用MASM汇编一个程序的方法为ml/c/coffhello.asm用LINK链接生成可执行文件的方法为:link/subsystem:consolehello.obj可以简化为:ml/coffhello.asm/link/subsystem:console10.1.2Windows汇编源程序的格式1.一个显示字符串的汇编程序2.程序格式①指令集②工作模式②工作模式(续)③option语句(2)includelib语句汇编程序中也需要调用一些外部模块(子程序/函数)来完成部分功能。例如:使用下面语句通知链接程序使用msvcrt.libincludelibmsvcrt.lib若要使用使用其他库文件,只需重复编写Includelib库文件名(3)函数声明语句格式:函数名称PROTO[调用规则]:[第一个参数类型][,:后续参数类型](4)include语句语法:include文件名例如:includekernel32.incincludeuser32.inc以后程序中用到user32.dll和kernel32.dll中的函数时,不需要事先声明就可以直接使用。(5)数据和代码部分程序中的数据部分和代码部分是分开定义的,分别以.data和.code开始,以end结束。end语句一般是整个程序的最后一条语句,end语句后面跟的是起始标号,指出了程序执行的第一条指令的位置。(6)跨行的语句当源程序的某一语句过长,不利于书写和阅读时,可以用反斜杠(\)作为换行符,将这条语句分为几行来写。3.一个Windows界面的汇编程序1.GUI程序2.CUI程序10.2Windows下的子程序设计与函数调用高级语言的函数就是汇编语言的子程序。汇编语言传递参数有3种常用方法:(1)通过寄存器传递;(2)通过数据区内的变量来传递;(3)通过堆栈传递。10.2.1通过全局变量及寄存器传递参数CALL指令执行时,它首先把返回地址作为一个双字压栈,再进入子程序执行。子程序最后执行的RET指令从堆栈中取出返回地址,返回到主程序。CALL指令和RET指令执行是必须依赖于堆栈的。cdecl方式是C语言函数的默认方式调用规则:(1)使用堆栈传递参数。(2)主程序按从右向左的顺序将参数逐个压栈,(3)在子程序中,使用[EBP+X]的方式来访问参数。(4)子程序用RET指令返回。(5)由主程序执行“ADDESP,n”指令调整ESP,达到堆栈平衡。(6)子程序的返回值放在EAX中。使用invoke伪指令对主程序和子程序的简化。在调用子程序时,使用invoke伪指令,后面跟子程序名和各个参数的取值即可。(1)子程序的调用规则(2)子程序的参数(3)子程序的进入/退出代码(4)子程序的返回指令(5)主程序中采用invoke语句程序示例:invoke.asm(P327)机器指令列表:invoke2invoke伪指令(续)invoke伪指令(续)invoke伪指令(续)10.2.4Windows中汇编与C的相互调用1.直接嵌入10.2.4.1直接嵌入2.C模块调用汇编模块C模块使用汇编模块中的变量C源程序要使用汇编模块中的变量,则在汇编模块中的变量名必须以下划线开头。例如:_strFormulasbyte"Pythagoreantheorem:x*x+y*y=z*z",0_xvalsdword3_yvalsdword4_zvalsdword5C模块中使用这些变量时,前面的下划线必须去掉。汇编模块使用C模块中的变量C模块调用汇编模块中的子程序例如,要编写一个显示当前时间的汇编程序,有两个API可以调用:_CRTIMPtime_t__cdecltime(time_t*);_CRTIMPchar*__cdeclctime(consttime_t*);而time_t就是一个长整型数。typedeflongtime_t;/*timevalue*/例9.编写显示当前时间的C程序(见教材p335)。10.2.6C++与汇编2.C++类的实例与方法程序demo.cpp(P341)中,有两个类A,B。A是B