《汇编语言 第十章 Windows汇编程序设计基础.ppt》由会员分享,可在线阅读,更多相关《汇编语言 第十章 Windows汇编程序设计基础.ppt(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、汇编语言程序设计汇编语言程序设计第十章第十章第十章第十章 Windows Windows Windows Windows 汇编语言程序设计基础汇编语言程序设计基础汇编语言程序设计基础汇编语言程序设计基础10.1 10.1 WindowsWindows汇编环境汇编环境10.2 10.2 WindowsWindows下的子程序设计与函数调用下的子程序设计与函数调用10.310.3 使用使用VCVC编译调试汇编程序编译调试汇编程序10.1 Windows10.1 Windows汇编环境汇编环境10.1.1 10.1.1 WindowsWindows下的下的MASMMASM与与LINKLINK10.1
2、.2 10.1.2 WindowsWindows汇编源程序的格式汇编源程序的格式 10.1.1 Windows10.1.1 Windows下的下的MASMMASM与与LINKLINKMASMMASM汇编器汇编器 LINKLINK连接器连接器 汇编连接步骤汇编连接步骤 1.MASM1.MASM汇编器汇编器MASMMASM汇编器的命令行用法为:汇编器的命令行用法为:ml/ml/ml/ml/选项选项选项选项 汇编程序源文件汇编程序源文件汇编程序源文件汇编程序源文件/link link link link 链接选项链接选项链接选项链接选项 选项选项选项选项功能功能功能功能/c/c/c/c仅进行编译,不
3、自动进行链接仅进行编译,不自动进行链接仅进行编译,不自动进行链接仅进行编译,不自动进行链接 /coffcoffcoffcoff产生的产生的产生的产生的objobjobjobj文件格式为文件格式为文件格式为文件格式为COFFCOFFCOFFCOFF格式格式格式格式 /CpCpCpCp源程序中区分大小写源程序中区分大小写源程序中区分大小写源程序中区分大小写 /FoFoFoFo filename filename filename filename 指定输出的指定输出的指定输出的指定输出的objobjobjobj文件名文件名文件名文件名 /Fl filename Fl filename Fl fil
4、ename Fl filename 产生产生产生产生.lstlstlstlst列表文件列表文件列表文件列表文件 /I pathname I pathname I pathname I pathname 指定指定指定指定includeincludeincludeinclude文件的路径文件的路径文件的路径文件的路径 /link link link link 指定链接时使用的选项指定链接时使用的选项指定链接时使用的选项指定链接时使用的选项 2.LINK2.LINK链接器链接器LINKLINK编译器的命令行用法为:编译器的命令行用法为:link link link link 选项选项选项选项 文件列
5、表文件列表文件列表文件列表 选选选选 项项项项 功功功功 能能能能 /out:out:out:out:输出文件名输出文件名输出文件名输出文件名 输出的文件名,扩展名默认为输出的文件名,扩展名默认为输出的文件名,扩展名默认为输出的文件名,扩展名默认为.exe exe exe exe/map:map:map:map:文件名文件名文件名文件名 生成生成生成生成MAPMAPMAPMAP文件文件文件文件 /libpathlibpathlibpathlibpath:目录名目录名目录名目录名 指定库文件的目录路径指定库文件的目录路径指定库文件的目录路径指定库文件的目录路径 /implibimplibimpl
6、ibimplib:文件名文件名文件名文件名 指定导入库文件指定导入库文件指定导入库文件指定导入库文件 /entry:entry:entry:entry:标号标号标号标号 指定入口指定入口指定入口指定入口 /comment:comment:comment:comment:字符串字符串字符串字符串 在在在在PE PE PE PE 文件的文件头后面加上文本注释(版权信息)文件的文件头后面加上文本注释(版权信息)文件的文件头后面加上文本注释(版权信息)文件的文件头后面加上文本注释(版权信息)/stack:stack:stack:stack:数字数字数字数字 设定堆栈的大小设定堆栈的大小设定堆栈的大小设
7、定堆栈的大小 /subsystem:subsystem:subsystem:subsystem:系统系统系统系统名名名名 指定程序运行的环境,可以是以下几种之一:指定程序运行的环境,可以是以下几种之一:指定程序运行的环境,可以是以下几种之一:指定程序运行的环境,可以是以下几种之一:NativeNativeNativeNative,WindowsWindowsWindowsWindows,ConsoleConsoleConsoleConsole,WindowsceWindowsceWindowsceWindowsce,Posix Posix Posix Posix 以以一一个个源源程程序序文文件
8、件hello.hello.asmasm为为例例,对对它它进进行行汇编链接,最后运行。汇编链接,最后运行。用用MASMMASM汇编一个程序的方法为汇编一个程序的方法为 ml/c/ml/c/coffcoff hello.hello.asmasm用用LINKLINK链接生成可执行文件的方法为:链接生成可执行文件的方法为:link/subsystem:console hello.link/subsystem:console hello.objobj可以简化为:可以简化为:ml/ml/coffcoff hello.hello.asmasm/link/subsystem:console/link/subs
9、ystem:console3.3.汇编链接步骤汇编链接步骤10.1.2 10.1.2 WindowsWindows汇编源程序的格式汇编源程序的格式 hello.hello.asmasm例子例子 程序格式程序格式 一个一个WindowsWindows界面的汇编程序界面的汇编程序 1.1.一个显示字符串的汇编程序一个显示字符串的汇编程序举例举例 hello.hello.asmasm(教材教材P311)P311)等同于下面的等同于下面的C C程序程序#include include.hintint main()main()printfprintf(Hello World!n);(Hello Worl
10、d!n);return 0;return 0;2.2.程序格式程序格式 (1 1)模式定义)模式定义程程序序的的第第一一部部分分是是有有关关模模式式定定义义的的3 3条条语语句:句:.386.386.model flat,model flat,stdcallstdcalloption option casemapcasemap:none:none这这些些语语句句定定义义了了程程序序使使用用的的指指令令集集、工工作作模式。模式。指令集指令集.386.386语句是汇编语言的伪指令,说明使用语句是汇编语言的伪指令,说明使用的指令集是哪一种的指令集是哪一种CPUCPU的。的。如果用汇编语言编写的是驱动
11、程序或者驱如果用汇编语言编写的是驱动程序或者驱动程序的一个小模块,而且驱动程序在特权动程序的一个小模块,而且驱动程序在特权级级0 0上运行,就需要使用上运行,就需要使用.386.386p p,后面带后面带p p的伪的伪指令表示程序中可以使用特权指令。指令表示程序中可以使用特权指令。在编程中如果使用了在编程中如果使用了MMXMMX指令,除了定义指令,除了定义.586.586之外,还要加上一句之外,还要加上一句.mmxmmx伪指令:伪指令:.586.586.mmxmmx工作模式工作模式.modelmodel语语句句用用来来定定义义程程序序工工作作的的模模式式,它它的格式是:的格式是:.model
12、model model model 内存模式内存模式内存模式内存模式,调用规则调用规则调用规则调用规则,其他模式其他模式其他模式其他模式 在在DOSDOS的的可可执执行行程程序序中中,可可用用到到.comcom文文件件和和.exeexe文件。文件。在在WindowsWindows环环境境下下,可可执执行行程程序序只只有有一一种种内存模式,即内存模式,即FlatFlat(平坦)模式平坦)模式 。工作模式(续)工作模式(续)在在DOSDOS下下的的汇汇编编语语言言程程序序中中,常常常常有有这这样样的程序片段:的程序片段:MOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS
13、,AX 其作用是给数据段寄存器其作用是给数据段寄存器DSDS赋值。赋值。在在编编程程时时,必必须须考考虑虑这这些些DSDS,ESES,SSSS等等段段寄存器是否正确设置。寄存器是否正确设置。在在WindowsWindows汇汇编编语语言言程程序序中中,则则不不必必考考虑虑这这些些问问题题。在在程程序序中中,不不需需要要也也不不应应该该给给CSCS,DSDS,ESES,SSSS等段寄存器赋值。等段寄存器赋值。optionoption语句语句optionoption语句有许多选项,这里介绍一语句有许多选项,这里介绍一种:种:option option casemapcasemap:none:non
14、e这条语句说明程序中的变量和子程序这条语句说明程序中的变量和子程序名是否对大小写敏感。名是否对大小写敏感。由于由于Windows APIWindows API函数中的函数名称是函数中的函数名称是区分大小写的,所以应该指定这个选项区分大小写的,所以应该指定这个选项“casemapcasemap:none”:none”(2 2)includelibincludelib语句语句汇汇编编程程序序中中也也需需要要调调用用一一些些外外部部模模块块(子子程序程序/函数)来完成部分功能。函数)来完成部分功能。例如:使用下面语句通知链接程序使用例如:使用下面语句通知链接程序使用msvcrtmsvcrt.lib.
15、libincludelib msvcrtincludelib msvcrt.lib.lib若要使用使用其他库文件,只需重复编写若要使用使用其他库文件,只需重复编写Includelib Includelib 库文件名库文件名(3 3)函数声明语句)函数声明语句 格式:格式:函数名称函数名称函数名称函数名称 PROTO PROTO PROTO PROTO 调用规则调用规则调用规则调用规则:第一个参数类型第一个参数类型第一个参数类型第一个参数类型,:,:,:,:后续参数类型后续参数类型后续参数类型后续参数类型 (4 4)includeinclude语句语句语法:语法:include include
16、文件名文件名 例如:例如:include kernel32.incinclude kernel32.incinclude user32.incinclude user32.inc以以 后后 程程 序序 中中 用用 到到 user32.user32.dlldll和和kernel32.kernel32.dlldll中中的的函函数数时时,不不需需要要事事先先声声明明就可以直接使用。就可以直接使用。(5 5)数据和代码部分)数据和代码部分 程序中的数据部分和代码部分是分开定义的,程序中的数据部分和代码部分是分开定义的,分别以分别以.data data 和和.code code 开始,以开始,以ende
17、nd结束。结束。endend语句一般是整个程序的最后一条语句,语句一般是整个程序的最后一条语句,endend语句后面跟的是起始标号,指出了程序执行的第语句后面跟的是起始标号,指出了程序执行的第一条指令的位置一条指令的位置 。(6 6)跨行的语句)跨行的语句当当源源程程序序的的某某一一语语句句过过长长,不不利利于于书书写写和和阅阅读读时时,可可以以用用反反斜斜杠杠()作作为为换换行行符符,将将这条语句分为几行来写。这条语句分为几行来写。3.3.一个一个WindowsWindows界面的汇编程序界面的汇编程序 下下下下面面面面给给给给出出出出一一一一个个个个使使使使用用用用WindowsWindo
18、wsWindowsWindows图图图图形形形形界界界界面面面面的的的的汇汇汇汇编编编编源源源源程程程程序(教材序(教材序(教材序(教材P319P319P319P319)。hellow2.hellow2.hellow2.hellow2.asmasmasmasm(显示一个显示一个显示一个显示一个WindowsWindowsWindowsWindows消息框)消息框)消息框)消息框)在编译链接时,必须在在编译链接时,必须在在编译链接时,必须在在编译链接时,必须在subsystemsubsystemsubsystemsubsystem选项中指定选项中指定选项中指定选项中指定“windowswindo
19、wswindowswindows”,而不是而不是而不是而不是“consoleconsoleconsoleconsole”。命令为:命令为:命令为:命令为:ml/ml/ml/ml/coff hellowcoff hellowcoff hellowcoff hellow.asmasmasmasm/link/subsystem:windows/link/subsystem:windows/link/subsystem:windows/link/subsystem:windows运行结果:运行结果:运行结果:运行结果:1.1.GUIGUI程序程序2.2.CUICUI程序程序10.1.3 10.1.3
20、图形界面与字符界面图形界面与字符界面 10.2 10.2 WindowsWindows下的子程序设计与函数调用下的子程序设计与函数调用10.2.1 10.2.1 通过全局变量及寄存器传递参数通过全局变量及寄存器传递参数10.2.2 10.2.2 C C函数的参数传递方式函数的参数传递方式cdeclcdecl10.2.3 10.2.3 伪指令伪指令invokeinvoke10.2.4 10.2.4 WindowsWindows中汇编与中汇编与C C的相互调用的相互调用10.2.5 10.2.5 在汇编中调用在汇编中调用WindowsWindows的的API API 10.2.6 10.2.6 C
21、+C+与汇编与汇编高级语言的函数就是汇编语言的子程序。高级语言的函数就是汇编语言的子程序。汇编语言传递参数有汇编语言传递参数有3 3种常用方法:种常用方法:(1 1)通过寄存器传递;)通过寄存器传递;(2 2)通过数据区内的变量来传递;)通过数据区内的变量来传递;(3 3)通过堆栈传递。)通过堆栈传递。10.2.1 10.2.1 通过全局变量及寄存器传递参数通过全局变量及寄存器传递参数 在程序中设计了两个子程序:在程序中设计了两个子程序:l lAddProc1AddProc1AddProc1AddProc1子程序使用子程序使用子程序使用子程序使用ESIESIESIESI和和和和EDIEDIED
22、IEDI作为入口参数,做完加法作为入口参数,做完加法作为入口参数,做完加法作为入口参数,做完加法后把和放在后把和放在后把和放在后把和放在EAXEAXEAXEAX中;中;中;中;l lAddProc2AddProc2AddProc2AddProc2子程序使用子程序使用子程序使用子程序使用A A A A和和和和B B B B作为入口参数,做完加法后把作为入口参数,做完加法后把作为入口参数,做完加法后把作为入口参数,做完加法后把和放在和放在和放在和放在R R R R中。中。中。中。程序:程序:callretcallret.asmasm(教材教材P321)P321)结果:结果:10+20=3010+2
23、0=30 50+60=110 50+60=110CALLCALL指指令令执执行行时时,它它首首先先把把返返回回地地址址作作为为一个双字压栈,再进入子程序执行。一个双字压栈,再进入子程序执行。子子程程序序最最后后执执行行的的RETRET指指令令从从堆堆栈栈中中取取出出返回地址,返回到主程序。返回地址,返回到主程序。CALLCALL指指令令和和RETRET指指令令执执行行是是必必须须依依赖赖于于堆堆栈的。栈的。cdeclcdecl方式是方式是C C语言函数的默认方式语言函数的默认方式 调用规则调用规则 :(1 1)使用堆栈传递参数。)使用堆栈传递参数。(2 2)主程序按从右向左的顺序将参数逐个压栈
24、,)主程序按从右向左的顺序将参数逐个压栈,(3 3)在子程序中,使用)在子程序中,使用 EBP+XEBP+X的方式来访问参的方式来访问参 数。数。(4 4)子程序用)子程序用RETRET指令返回。指令返回。(5 5)由由主主程程序序执执行行“ADD ADD ESP,ESP,n n”指指令令调调整整ESPESP,达到堆栈平衡。达到堆栈平衡。(6 6)子程序的返回值放在)子程序的返回值放在EAXEAX中。中。10.2.2 10.2.2 C C函数的参数传递方式函数的参数传递方式cdeclcdecl 使用使用使用使用invokeinvokeinvokeinvoke伪指令对主程序和子程序的简化。伪指令
25、对主程序和子程序的简化。伪指令对主程序和子程序的简化。伪指令对主程序和子程序的简化。在调用子程序时,使用在调用子程序时,使用invokeinvoke伪指令,后伪指令,后面跟子程序名和各个参数的取值即可。面跟子程序名和各个参数的取值即可。10.2.3 10.2.3 伪指令伪指令invokeinvoke(1 1 1 1)子程序的调用规则)子程序的调用规则)子程序的调用规则)子程序的调用规则(2 2 2 2)子程序的参数)子程序的参数)子程序的参数)子程序的参数(3 3 3 3)子程序的进入)子程序的进入)子程序的进入)子程序的进入/退出代码退出代码退出代码退出代码(4 4 4 4)子程序的返回指令
26、)子程序的返回指令)子程序的返回指令)子程序的返回指令(5 5 5 5)主程序中采用)主程序中采用)主程序中采用)主程序中采用invokeinvokeinvokeinvoke语句语句语句语句程序示例:程序示例:程序示例:程序示例:invoke.invoke.invoke.invoke.asm asm asm asm(P327)(P327)(P327)(P327)机器指令列表:机器指令列表:机器指令列表:机器指令列表:invoke2invoke2invoke2invoke21.1.使用使用invokeinvoke伪指令注意事项伪指令注意事项invokeinvoke伪指令伪指令(续续)对照对照in
27、voke.invoke.asmasm和机器指令列表,可以观和机器指令列表,可以观察到以下几点:察到以下几点:(1 1)自动加入的指令)自动加入的指令AddProc5AddProc5,AddProc6AddProc6中中的的一一些些语语句句是是MASMMASM自自动加入的动加入的 (2 2)参数的替换)参数的替换参参数数a a用用 EBP+8EBP+8替替换换,参参数数b b用用 EBP+12EBP+12替替换。换。(3 3)返回指令)返回指令AddProc5AddProc5采采 用用 C C规规 则则,用用“RET”RET”返返 回回;AddProc6AddProc6采用采用stdcallst
28、dcall规则,用规则,用“RET 8”RET 8”返回返回 invokeinvoke伪指令伪指令(续续)(4 4)invokeinvoke语句转换为语句转换为CALLCALL指令指令 invokeinvoke后面跟的参数被逐一压入堆栈,再跟后面跟的参数被逐一压入堆栈,再跟上一上一条条CALLCALL指令。指令。(5 5)堆栈平衡)堆栈平衡对对AddProc5AddProc5的调用,在的调用,在CALLCALL指令后面用指令后面用“ADD ESP,8”ADD ESP,8”来平衡堆栈。来平衡堆栈。对对AddProc6AddProc6的调用,由于在返回时使用了的调用,由于在返回时使用了“RET 8
29、”RET 8”,在在CALLCALL指令后面不需要指令后面不需要“ADD ADD ESP,8”ESP,8”invokeinvoke伪指令(续)伪指令(续)2 2使用使用invokeinvoke调用子程序的一些限制调用子程序的一些限制 invokeinvoke伪伪指指令令后后面面跟跟的的参参数数必必须须直直接接能能够够作为作为PUSHPUSH指令的源操作数。指令的源操作数。错误的写法:错误的写法:invoke invoke addprocaddproc,r*2,30,r*2,30正确的写法:正确的写法:MOV EBX,rMOV EBX,r SHL EBX,1 SHL EBX,1 invoke i
30、nvoke addprocaddproc,EBX,30,EBX,3010.2.4 10.2.4 WindowsWindows中汇编与中汇编与C C的相互调用的相互调用关键关键:两种语言的接口问题两种语言的接口问题解决方法:解决方法:在在C C程序中直接嵌入汇编代码程序中直接嵌入汇编代码 由由C C语言主程序调用汇编子程序语言主程序调用汇编子程序 1.1.直接嵌入直接嵌入 C C语言程序中直接嵌入汇编语句语言程序中直接嵌入汇编语句 格式为:格式为:_ _asm asm 汇编语句汇编语句对于连续的多个汇编语句,格式为:对于连续的多个汇编语句,格式为:asmasm 汇编语句汇编语句 汇编语句汇编语句
31、 10.2.4.1 10.2.4.1 直接嵌入直接嵌入 内嵌汇编语句的操作码必须是有效的内嵌汇编语句的操作码必须是有效的内嵌汇编语句的操作码必须是有效的内嵌汇编语句的操作码必须是有效的80808080 x86x86x86x86指指指指令。令。令。令。不能使用不能使用不能使用不能使用bytebytebytebyte,wordwordwordword,dworddworddworddword等语句定义数据。等语句定义数据。等语句定义数据。等语句定义数据。内嵌汇编语句中的操作数可以是:内嵌汇编语句中的操作数可以是:内嵌汇编语句中的操作数可以是:内嵌汇编语句中的操作数可以是:寄存器;寄存器;寄存器;寄
32、存器;局部变量、全局变量和函数参数;局部变量、全局变量和函数参数;局部变量、全局变量和函数参数;局部变量、全局变量和函数参数;结构成员。结构成员。结构成员。结构成员。程序清单:程序清单:程序清单:程序清单:inline.c inline.c inline.c inline.c(P328P328P328P328)2.2.C C模块调用汇编模块模块调用汇编模块 l lC C源程序中所有语句要符合源程序中所有语句要符合C C的语法规则;的语法规则;l l汇编源程序的所有语句要符合汇编的语法规则;汇编源程序的所有语句要符合汇编的语法规则;l lC C模块可调用汇编模块中的子程序,还可以使用模块可调用汇
33、编模块中的子程序,还可以使用汇编模块中定义的全局变量;汇编模块中定义的全局变量;l l汇编模块可调用汇编模块可调用C C模块中的函数,可以使用模块中的函数,可以使用C C模块模块中定义的全局变量。中定义的全局变量。C C模块使用汇编模块中的变量模块使用汇编模块中的变量C C和汇编有些变量类型是等价的,可以相和汇编有些变量类型是等价的,可以相互转换:互转换:C C源程序要使用汇编模块中的变量,则在汇源程序要使用汇编模块中的变量,则在汇编模块中的变量名必须以下划线开头。编模块中的变量名必须以下划线开头。例如:例如:_ _strFormula strFormula sbyte sbyte Pytha
34、gorean Pythagorean theorem:theorem:x*x+y*y=z*z,0 x*x+y*y=z*z,0_ _xval sdword xval sdword 3 3_ _yval sdword yval sdword 4 4_ _zval sdword zval sdword 5 5C C模模块块中中使使用用这这些些变变量量时时,前前面面的的下下划划线线必必须去掉。须去掉。汇编模块使用汇编模块使用C C模块中的变量模块中的变量C C模块中,应采用模块中,应采用externextern来指明变量可以由来指明变量可以由外部模块所使用,外部模块所使用,例如:例如:extern e
35、xtern intint x,y,z;x,y,z;在汇编模块中,要使用这个变量,应该用在汇编模块中,要使用这个变量,应该用EXTRNEXTRN加以说明,加以说明,例如:例如:EXTRN _x:EXTRN _x:sdwordsdword,_y:,_y:sdwordsdword,_z:_z:sdwordsdword使用变量如:使用变量如:MOV EAX,_xMOV EAX,_xC C模块调用汇编模块中的子程序模块调用汇编模块中的子程序 关键功能用汇编语言来编写,再由关键功能用汇编语言来编写,再由C C语言语言来调用。来调用。程序举例:程序举例:C/C/汇编联合编程的主模块汇编联合编程的主模块 un
36、ited.cunited.c(P330)(P330)C/C/汇编联合编程的子模块汇编联合编程的子模块 unite.unite.asm asm 例例例例如如如如,要要要要编编编编写写写写一一一一个个个个显显显显示示示示当当当当前前前前时时时时间间间间的的的的汇汇汇汇编编编编程程程程序序序序,有有有有两两两两个个个个APIAPIAPIAPI可以调用:可以调用:可以调用:可以调用:_ _ _ _CRTIMP time_t _CRTIMP time_t _CRTIMP time_t _CRTIMP time_t _cdeclcdeclcdeclcdecl time(time_t*);time(time
37、_t*);time(time_t*);time(time_t*);_CRTIMP char*_CRTIMP char*_CRTIMP char*_CRTIMP char*_cdecl ctimecdecl ctimecdecl ctimecdecl ctime(const time_t*);(const time_t*);(const time_t*);(const time_t*);而而而而time_ttime_ttime_ttime_t就是一个长整型数。就是一个长整型数。就是一个长整型数。就是一个长整型数。typedeftypedeftypedeftypedef long time_t;/
38、*time value*/long time_t;/*time value*/long time_t;/*time value*/long time_t;/*time value*/例例例例9 9 9 9编写显示当前时间的编写显示当前时间的编写显示当前时间的编写显示当前时间的C C C C程序程序程序程序(见教材见教材见教材见教材p335)p335)p335)p335)。10.2.5 10.2.5 在汇编中调用在汇编中调用WindowsWindows的的API API 10.2.6 10.2.6 C+C+与汇编与汇编 1 1使用使用C C方式共享变量和函数方式共享变量和函数在在C+C+一一方方
39、,要要将将与与汇汇编编模模块块共共享享的的变变量、函数等用量、函数等用extern“C”extern“C”的形式说明。的形式说明。举例:举例:C+/C+/汇编联合编程汇编联合编程 ArraySumArraySum.cpp cpp(P338)(P338)C+/C+/汇编联合编程汇编联合编程 ArraySumArraySum.asm asm 2 2C+C+类的实例与方法类的实例与方法程序程序demo.demo.cppcpp(P341)(P341)中,有两个类中,有两个类A A,B B。A A是是B B的的基基类类,类类A A和和类类B B各各有有自自己己的的reset reset()方方法法和和o
40、utput output()方方法法。程程序序的的输输出出结果为:结果为:A:1A:1B:2,3B:2,3A:10A:10B:10,0B:10,0类类A A的实例的实例a a,类,类B B的实例的实例b b所占用的内存单所占用的内存单元的内容如图:元的内容如图:类的类的vtablevtable就像一张表格,存放它的虚函就像一张表格,存放它的虚函数的地址。数的地址。10.3 10.3 使用使用VCVC编译调试汇编程序编译调试汇编程序10.3.1 10.3.1 建立工程建立工程10.3.2 10.3.2 设置调试选项设置调试选项10.3.3 10.3.3 常用调试命令常用调试命令10.3.1 10
41、.3.1 建立工程建立工程(1)(1)启动启动VCVC后,从菜单中选择后,从菜单中选择FileNewFileNew。(2)(2)在打开的在打开的NewNew对话框顶部,单击对话框顶部,单击ProjectsProjects,再选中再选中Win32 Console ApplicationWin32 Console Application。在在LocationLocation编辑框中编辑框中输入输入“c:c:asmasm”,再在再在Project nameProject name中输入中输入testtest。(3)(3)单击单击OKOK按钮后,出现一个新的对话框,单击按钮后,出现一个新的对话框,单击
42、FinishFinish。(4)(4)VCVC的窗口的左边显示出的窗口的左边显示出test classestest classes,下面有下面有ClassViewClassView和和FileViewFileView两种视图。两种视图。(5)(5)可可将将hellowhellow.asmasm(或或其其它它的的一一个个asmasm源源程程序序文文件件)拷拷贝贝到到c:c:asmasmtesttest中中,并并改改名名为为test.test.asmasm。也也可可以以将将其其 它它 的的 汇汇 编编 程程 序序 源源 文文 件件 拷拷 贝贝 到到c:c:asmasmtesttest.testte
43、st.asmasm。(6)(6)从从菜菜单单中中选选择择ProjectAdd ProjectAdd to to ProjectsFilesProjectsFiles,在在 该该 对对 话话 框框 中中 的的 文文 件件 名名 处处 输输 入入“c:c:asmasmtesttest.testtest.asmasm”。(7)(7)在在VCVC窗窗口口的的左左边边的的视视图图中中,展展开开FileViewFileView中中的的Source FilesSource Files,显示出显示出“test.test.asmasm”。(8)(8)在菜单中选择在菜单中选择SettingSetting。弹出另一
44、个对话框。如弹出另一个对话框。如图图11-1311-13所示。在所示。在CommandsCommands编辑框中输入编辑框中输入“ml/c ml/c/coffcoff/ZiZi test.test.asmasm”,在在OutputsOutputs编辑框中输编辑框中输入入“test.test.objobj”。再再单击单击OKOK按钮。按钮。(9)(9)将将“ML.EXE”ML.EXE”和和“ML.ERR”ML.ERR”拷贝到拷贝到“c:windows”c:windows”。(10)(10)验证是否能在验证是否能在VCVC中编译中编译test.test.asmasm。10.3.2 10.3.2 设
45、置调试选项设置调试选项 (1)1)从从ToolsTools菜菜单单中中选选择择OptionsOptions,再再选选择择DebugDebug页页,选选中中Disassembly Disassembly windowwindow中中的的Code Code bytes(bytes(前前面面打上对勾打上对勾)。(2)2)在在Memory Memory windowwindow中中,选选中中Fixed Fixed widthwidth,在在后后面填入数字面填入数字1616。(3)3)在在GeneralGeneral中,选中中,选中HexdecimalHexdecimal display display
46、(4 4)不选)不选View floating point registersView floating point registers。10.3.3 10.3.3 常用调试命令常用调试命令 功能键功能键作用作用描述描述F11F11单步执行单步执行Step IntoStep IntoF10F10执行执行Step OverStep OverCtrl+F10Ctrl+F10执行到当前光标的位置的指令执行到当前光标的位置的指令Run to CursorRun to CursorF9F9在在当当前前光光标标的的位位置置的的指指令令上上设设置置/清除断点清除断点Set/Clear Set/Clear Breakpoint Breakpoint at Cursorat CursorF5F5执行程序执行程序GoGoShift+F5Shift+F5终止程序,退出程序终止程序,退出程序Stop DebuggingStop Debugging设设置置当当前前指指令令将光标处的指令设为当前指令将光标处的指令设为当前指令Set Next StatementSet Next StatementShift+F11Shift+F11当前子程序执行结束当前子程序执行结束Step OutStep Out