汇编语言_第十章_windows汇编程序设计基础

上传人:kms****20 文档编号:56857986 上传时间:2018-10-16 格式:PPT 页数:49 大小:310KB
返回 下载 相关 举报
汇编语言_第十章_windows汇编程序设计基础_第1页
第1页 / 共49页
汇编语言_第十章_windows汇编程序设计基础_第2页
第2页 / 共49页
汇编语言_第十章_windows汇编程序设计基础_第3页
第3页 / 共49页
汇编语言_第十章_windows汇编程序设计基础_第4页
第4页 / 共49页
汇编语言_第十章_windows汇编程序设计基础_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《汇编语言_第十章_windows汇编程序设计基础》由会员分享,可在线阅读,更多相关《汇编语言_第十章_windows汇编程序设计基础(49页珍藏版)》请在金锄头文库上搜索。

1、第十章 Windows 汇编语言程序设计基础,10.1 Windows汇编环境 10.2 Windows下的子程序设计与函数调用 10.3 使用VC编译调试汇编程序,10.1 Windows汇编环境,10.1.1 Windows下的MASM与LINK 10.1.2 Windows汇编源程序的格式,10.1.1 Windows下的MASM与LINK,MASM汇编器 LINK连接器 汇编连接步骤,1. MASM汇编器,MASM汇编器的命令行用法为: ml /选项 汇编程序源文件 /link 链接选项,2. LINK链接器,LINK编译器的命令行用法为:link 选项 文件列表,以一个源程序文件he

2、llo.asm为例,对它进行汇编链接,最后运行。用MASM汇编一个程序的方法为ml /c /coff hello.asm用LINK链接生成可执行文件的方法为:link /subsystem:console hello.obj可以简化为: ml /coff hello.asm /link /subsystem:console,3. 汇编链接步骤,10.1.2 Windows汇编源程序的格式,hello.asm例子 程序格式 一个Windows界面的汇编程序,1.一个显示字符串的汇编程序,举例 hello.asm(教材P311) 等同于下面的C程序 #include int main( ) pri

3、ntf(“Hello World!n“);return 0; ,2. 程序格式,(1)模式定义程序的第一部分是有关模式定义的3条语句:.386.model flat, stdcalloption casemap:none这些语句定义了程序使用的指令集、工作模式。,指令集,.386语句是汇编语言的伪指令,说明使用的指令集是哪一种CPU的。如果用汇编语言编写的是驱动程序或者驱动程序的一个小模块,而且驱动程序在特权级0上运行,就需要使用.386p,后面带p的伪指令表示程序中可以使用特权指令。 在编程中如果使用了MMX指令,除了定义.586之外,还要加上一句.mmx伪指令:.586.mmx,工作模式,

4、.model语句用来定义程序工作的模式,它的格式是:.model 内存模式,调用规则,其他模式在DOS的可执行程序中,可用到.com文件和.exe文件。在Windows环境下,可执行程序只有一种内存模式,即Flat(平坦)模式 。,工作模式(续),在DOS下的汇编语言程序中,常常有这样的程序片段:MOV AX, DATAMOV DS, AX 其作用是给数据段寄存器DS赋值。在编程时,必须考虑这些DS,ES,SS等段寄存器是否正确设置。 在Windows汇编语言程序中,则不必考虑这些问题。在程序中,不需要也不应该给CS,DS,ES,SS等段寄存器赋值。,option语句,option语句有许多选

5、项,这里介绍一种:option casemap:none这条语句说明程序中的变量和子程序名是否对大小写敏感。 由于Windows API函数中的函数名称是区分大小写的,所以应该指定这个选项“casemap: none”,(2)includelib语句汇编程序中也需要调用一些外部模块(子程序/函数)来完成部分功能。例如:使用下面语句通知链接程序使用 msvcrt.libincludelib msvcrt.lib若要使用使用其他库文件,只需重复编写Includelib 库文件名,(3)函数声明语句格式: 函数名称 PROTO 调用规则:第一个参数类型,:后续参数类型,(4)include语句 语法

6、:include 文件名 例如:include kernel32.incinclude user32.inc以后程序中用到user32.dll和kernel32.dll中的函数时,不需要事先声明就可以直接使用。,(5)数据和代码部分程序中的数据部分和代码部分是分开定义的, 分别以.data 和.code 开始,以end结束。end语句一般是整个程序的最后一条语句,end 语句后面跟的是起始标号,指出了程序执行的第 一条指令的位置 。,(6)跨行的语句当源程序的某一语句过长,不利于书写和阅读时,可以用反斜杠()作为换行符,将这条语句分为几行来写。,3. 一个Windows界面的汇编程序,下面给出

7、一个使用Windows图形界面的汇编源程序(教材P319) 。hellow2.asm(显示一个Windows消息框)在编译链接时,必须在subsystem选项中指定“windows”,而不是“console”。命令为: ml /coff hellow.asm /link /subsystem:windows 运行结果:,1. GUI程序 2. CUI程序,10.1.3 图形界面与字符界面,10.2 Windows下的子程序设计与函数调用,10.2.1 通过全局变量及寄存器传递参数 10.2.2 C函数的参数传递方式cdecl 10.2.3 伪指令invoke 10.2.4 Windows中汇编

8、与C的相互调用 10.2.5 在汇编中调用Windows的API 10.2.6 C+与汇编,高级语言的函数就是汇编语言的子程序。 汇编语言传递参数有3种常用方法: (1)通过寄存器传递; (2)通过数据区内的变量来传递; (3)通过堆栈传递。,10.2.1 通过全局变量及寄存器传递参数,在程序中设计了两个子程序: AddProc1子程序使用ESI和EDI作为入口参数,做完加法后把和放在EAX中; AddProc2子程序使用A和B作为入口参数,做完加法后把和放在R中。 程序:callret.asm(教材P321) 结果:10 + 20 = 3050 + 60 = 110,CALL指令执行时,它首

9、先把返回地址作为一个双字压栈,再进入子程序执行。子程序最后执行的RET指令从堆栈中取出返回地址,返回到主程序。CALL指令和RET指令执行是必须依赖于堆栈的。,cdecl方式是C语言函数的默认方式 调用规则 : (1)使用堆栈传递参数。 (2)主程序按从右向左的顺序将参数逐个压栈, (3)在子程序中,使用EBP+X的方式来访问参 数。 (4)子程序用RET指令返回。 (5)由主程序执行“ADD ESP, n”指令调整ESP,达到堆栈平衡。 (6)子程序的返回值放在EAX中。,10.2.2 C函数的参数传递方式cdecl,使用invoke伪指令对主程序和子程序的简化。在调用子程序时,使用invo

10、ke伪指令,后面跟子程序名和各个参数的取值即可。,10.2.3 伪指令invoke,(1)子程序的调用规则 (2)子程序的参数 (3)子程序的进入/退出代码 (4)子程序的返回指令 (5)主程序中采用invoke语句 程序示例:invoke.asm (P327) 机器指令列表:invoke2,1.使用invoke伪指令注意事项,invoke伪指令(续),对照invoke.asm和机器指令列表,可以观 察到以下几点: (1)自动加入的指令AddProc5,AddProc6中的一些语句是MASM自动加入的 (2)参数的替换参数a用EBP+8替换,参数b用EBP+12替换。 (3)返回指令AddPr

11、oc5采用C规则,用“RET”返回;AddProc6采用stdcall规则,用“RET 8”返回,invoke伪指令(续),(4)invoke语句转换为CALL指令 invoke后面跟的参数被逐一压入堆栈,再跟上一 条CALL指令。 (5)堆栈平衡对AddProc5的调用,在CALL指令后面用“ADD ESP, 8”来平衡堆栈。对AddProc6的调用,由于在返回时使用了“RET 8”,在CALL指令后面不需要“ADD ESP, 8”,invoke伪指令(续),2使用invoke调用子程序的一些限制invoke伪指令后面跟的参数必须直接能够作为PUSH指令的源操作数。 错误的写法:invoke

12、 addproc, r*2, 30 正确的写法: MOV EBX, rSHL EBX, 1invoke addproc, EBX, 30,10.2.4 Windows中汇编与C的相互调用,关键:两种语言的接口问题 解决方法: 在C程序中直接嵌入汇编代码 由C语言主程序调用汇编子程序,1.直接嵌入,C语言程序中直接嵌入汇编语句 格式为:_asm 汇编语句 对于连续的多个汇编语句,格式为: asm 汇编语句汇编语句 ,10.2.4.1 直接嵌入,内嵌汇编语句的操作码必须是有效的80x86指 令。 不能使用byte,word,dword等语句定义数据。内嵌汇编语句中的操作数可以是: 寄存器; 局部变

13、量、全局变量和函数参数; 结构成员。 程序清单:inline.c (P328),2.C模块调用汇编模块,C源程序中所有语句要符合C的语法规则; 汇编源程序的所有语句要符合汇编的语法规则; C模块可调用汇编模块中的子程序,还可以使用汇编模块中定义的全局变量; 汇编模块可调用C模块中的函数,可以使用C模块中定义的全局变量。,C模块使用汇编模块中的变量,C和汇编有些变量类型是等价的,可以相互转换:,C源程序要使用汇编模块中的变量,则在汇编模块中的变量名必须以下划线开头。 例如:_strFormula sbyte “Pythagorean theorem: x*x+y*y=z*z“,0_xval sd

14、word 3_yval sdword 4_zval sdword 5C模块中使用这些变量时,前面的下划线必须去掉。,汇编模块使用C模块中的变量,C模块中,应采用extern来指明变量可以由外部模块所使用,例如:extern int x, y, z;在汇编模块中,要使用这个变量,应该用EXTRN加以说明,例如:EXTRN _x:sdword, _y:sdword, _z:sdword使用变量如:MOV EAX, _x,C模块调用汇编模块中的子程序,关键功能用汇编语言来编写,再由C语言来调用。 程序举例:C/汇编联合编程的主模块 united.c(P330)C/汇编联合编程的子模块 unite.a

15、sm,例如,要编写一个显示当前时间的汇编程序,有两个API可以调用:_CRTIMP time_t _cdecl time(time_t *); _CRTIMP char * _cdecl ctime(const time_t *);而time_t就是一个长整型数。typedef long time_t; /* time value */例9编写显示当前时间的C程序 (见教材p335) 。,10.2.5 在汇编中调用Windows的API,10.2.6 C+与汇编,1使用C方式共享变量和函数在C+一方,要将与汇编模块共享的变量、函数等用extern “C”的形式说明。 举例: C+/汇编联合编程

16、 ArraySum.cpp (P338) C+/汇编联合编程 ArraySum.asm,2C+类的实例与方法 程序demo.cpp(P341)中,有两个类A,B。A是B的基类,类A和类B各有自己的reset ( ) 方法和output ( ) 方法。程序的输出结果为:A: 1B: 2, 3A: 10B: 10, 0,类A的实例a,类B的实例b所占用的内存单元的内容如图:类的vtable就像一张表格,存放它的虚函数的地址。,10.3 使用VC编译调试汇编程序,10.3.1 建立工程 10.3.2 设置调试选项 10.3.3 常用调试命令,10.3.1 建立工程,(1)启动VC后,从菜单中选择FileNew。 (2)在打开的New对话框顶部,单击Projects,再选中Win32 Console Application。在Location编辑框中输入“c:asm”,再在Project name中输入test。 (3)单击OK按钮后,出现一个新的对话框,单击Finish。 (4) VC的窗口的左边显示出test classes,下面有ClassView和FileView两种视图。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号