预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共49页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

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

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.lib includelibmsvcrt.lib 若要使用使用其他库文件,只需重复编写 Includelib库文件名(3)函数声明语句 格式: 函数名称PROTO[调用规则]:[第一个参数类型][,:后续参数类型](4)include语句 语法: include文件名 例如: includekernel32.inc includeuser32.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 _zvalsdword5 C模块中使用这些变量时,前面的下划线必须去掉。汇编模块使用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