汇编语言_第十章_Windows汇编程序设计基础.ppt_第1页
汇编语言_第十章_Windows汇编程序设计基础.ppt_第2页
汇编语言_第十章_Windows汇编程序设计基础.ppt_第3页
汇编语言_第十章_Windows汇编程序设计基础.ppt_第4页
汇编语言_第十章_Windows汇编程序设计基础.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 选项 文件列表,以一个源程序文件h

2、ello.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(

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

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

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

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

7、句分为几行来写。,3. 一个Windows界面的汇编程序,下面给出一个使用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函数的参数传递方式cdec

8、l 10.2.3 伪指令invoke 10.2.4 Windows中汇编与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

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

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

11、数的替换 参数a用EBP+8替换,参数b用EBP+12替换。 (3)返回指令 AddProc5采用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调用子程序的一些限制 i

12、nvoke伪指令后面跟的参数必须直接能够作为PUSH指令的源操作数。 错误的写法:invoke addproc, r*2, 30 正确的写法: MOV EBX, r SHL EBX, 1 invoke addproc, EBX, 30,10.2.4 Windows中汇编与C的相互调用,关键:两种语言的接口问题 解决方法: 在C程序中直接嵌入汇编代码 由C语言主程序调用汇编子程序,1.直接嵌入,C语言程序中直接嵌入汇编语句 格式为: _asm 汇编语句 对于连续的多个汇编语句,格式为: asm 汇编语句 汇编语句 , 直接嵌入,内嵌汇编语句的操作码必须是有效的80 x86指 令。

13、 不能使用byte,word,dword等语句定义数据。 内嵌汇编语句中的操作数可以是: 寄存器; 局部变量、全局变量和函数参数; 结构成员。 程序清单:inline.c (P328),2.C模块调用汇编模块,C源程序中所有语句要符合C的语法规则; 汇编源程序的所有语句要符合汇编的语法规则; C模块可调用汇编模块中的子程序,还可以使用汇编模块中定义的全局变量; 汇编模块可调用C模块中的函数,可以使用C模块中定义的全局变量。,C模块使用汇编模块中的变量,C和汇编有些变量类型是等价的,可以相互转换:,C源程序要使用汇编模块中的变量,则在汇编模块中的变量名必须以下划线开头。 例如: _strForm

14、ula sbyte Pythagorean theorem: x*x+y*y=z*z,0 _xval sdword 3 _yval sdword 4 _zval sdword 5 C模块中使用这些变量时,前面的下划线必须去掉。,汇编模块使用C模块中的变量,C模块中,应采用extern来指明变量可以由外部模块所使用, 例如:extern int x, y, z; 在汇编模块中,要使用这个变量,应该用EXTRN加以说明, 例如:EXTRN _x:sdword, _y:sdword, _z:sdword 使用变量如:MOV EAX, _x,C模块调用汇编模块中的子程序,关键功能用汇编语言来编写,再由

15、C语言来调用。 程序举例: C/汇编联合编程的主模块 united.c(P330) C/汇编联合编程的子模块 unite.asm,例如,要编写一个显示当前时间的汇编程序,有两个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+与汇编,

16、1使用C方式共享变量和函数 在C+一方,要将与汇编模块共享的变量、函数等用extern “C”的形式说明。 举例: C+/汇编联合编程 ArraySum.cpp (P338) C+/汇编联合编程 ArraySum.asm,2C+类的实例与方法 程序demo.cpp(P341)中,有两个类A,B。 A是B的基类,类A和类B各有自己的reset ( ) 方法和output ( ) 方法。程序的输出结果为: A: 1 B: 2, 3 A: 10 B: 10, 0,类A的实例a,类B的实例b所占用的内存单元的内容如图: 类的vtable就像一张表格,存放它的虚函数的地址。,10.3 使用VC编译调试汇

17、编程序,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两种视图。,(5) 可将hellow.asm(或其它的一个asm源程序文件)拷贝到c:asmtest中,并改名为test.asm。也可以将其它的汇编程序源文件拷贝到c:asmtesttest.asm。 (6) 从菜单中选择ProjectAdd to ProjectsFiles,在该对话框中的文件名处输入“c:asmtesttest.asm”。 (7)在VC窗口的左边的视图中,展开FileView中的Source Files,显示出“test.asm”。,(8)在菜单中选择Setting。弹出另一个对话框。如图11-13所示。在Commands编辑框中输入“ml /c /coff /Zi test.asm”,在Outputs编辑框中输入“test.obj”。再单击OK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论