汇编语言程序设计 吴 向 军 中山大学计算机科学系 2003.03.20
附录1 汇编语言编程和调试工具 1.1、汇编语言编程工具 1.1.1、宏汇编MASM系统 附录1 汇编语言编程和调试工具 1.1、汇编语言编程工具 学习汇编语言的目的就是要用汇编语言编程来解决实际问题,下面介绍二种常用的汇编语言编程环境:宏汇编MASM 6.11和Turbo Assember 5.0。 1.1.1、宏汇编MASM系统 在宏汇编MASM系统中,可用二种方法来处理源程序:命令行和集成环境。 一、命令行命令 1、编写源程序 可用计算机系统中各种能编辑文本文件的编辑器来编辑汇编源程序。常用的编辑器有:EDIT、Word、记事本、写字板、WPS等。源文件的后缀为:.ASM。 2、汇编程序 当源程序编写好后,可用MASM命令来汇编该源程序。如果源程序没有语法错误,那么,将生成目标文件(.OBJ文件),为最终生成可执行文件作准备,但如果源程序有错误,汇编程序将显示出错误位置和原因,也可用列表文件(.LST文件)来查看出错位置和原因。 下面给出一些使用该命令的实例情况。
附录1 汇编语言编程和调试工具 例1.1:查看MASM命令的功能 …>masm /?(*) …… 附录1 汇编语言编程和调试工具 例1.1:查看MASM命令的功能 …>masm /?(*) …… /Zi Generate symbolic information for CodeView /Zd Generate line-number information 其中:选项/Zi和/Zd是经常被引用的二个选项,因为它们与符号跟踪有关。 例1.2:用MASM命令汇编源程序 …>masm test Invoking: ML.EXE /I. /Zm /c test.asm Assembling: test.asm 如果MASM命令显示了类似如上的处理结果,那么,表示源文件TEST.ASM已成功汇编,并已生成了其目标文件TEST.OBJ。 (*) 用户输入的命令用“下划线”来表示,系统显示的内容没有“下划线”。
附录1 汇编语言编程和调试工具 例1.3:用MASM命令汇编源程序 …>masm test …… 附录1 汇编语言编程和调试工具 例1.3:用MASM命令汇编源程序 …>masm test …… Invoking: ML.EXE /I. /Zm /c test.asm Assembling: test.asm test.asm(10): error A2070: invalid instruction operands 如果MASM命令显示了类似如上的处理结果,那么,表示源文件有错,没有生成其目标文件。在本例中,显示第10行有语法错:非法的指令操作数。这时,要用编辑器阅读源程序的第10行,看看输入指令时是否有误。 假如源程序有许多错误,很难记住全部出错位置,那么,可用列表文件来辅助查错。
附录1 汇编语言编程和调试工具 例1.4:在汇编源程序的同时,生成其列表文件。 …>masm test, ,test …… 附录1 汇编语言编程和调试工具 例1.4:在汇编源程序的同时,生成其列表文件。 …>masm test, ,test …… Assembling: test.asm test.asm(10): error A2070: invalid instruction operands 列表文件TEST.LST是一个文本文件,可用编辑器直接阅读,并可看出其错误的位置和原因。下面是一个列表文件的实例。
附录1 汇编语言编程和调试工具 …>edit test.lst 附录1 汇编语言编程和调试工具 …>edit test.lst Microsoft (R) Macro Assembler Version 6.11 08/26/00 18:42:57 test.asm Page 1 - 1 .model small .486 0000 .data .radix 7 0000 2A 08 0F w2 db 60,11,18 0003 000A 0009 w1 dw 10T, 1001B 0000 .code .startup mov dl, 7777h test.asm(10): error A2070: invalid instruction operands 0010 8B C2 mov ax, dx 0012 0F A4 C2 01 shld dx, ax, 1 0016 D1 D0 rcl ax, 1 .exit 0 end 在此后面还有其它内容,但它们对查错没有帮助,所以,在此省略。
附录1 汇编语言编程和调试工具 3、连接程序 当由源文件汇编成功后,即可用连接程序(LINK.EXE)生成其可执行文件。 附录1 汇编语言编程和调试工具 3、连接程序 当由源文件汇编成功后,即可用连接程序(LINK.EXE)生成其可执行文件。 例1.5:查看连接程序(LINK.EXE)的具体选项。 …>link /? LINK <objs>,<exefile>,<mapfile>,<libs>,<deffile> Valid options are: /? /ALIGNMENT /BATCH /CODEVIEW …… /STACK /TINY /WARNFIXUP
附录1 汇编语言编程和调试工具 例1.6:用连接程序生成执行文件。 方法1: …>link test …… 附录1 汇编语言编程和调试工具 例1.6:用连接程序生成执行文件。 方法1: …>link test …… Run File [test.exe]: List File [nul.map]: Libraries [.lib]: Definitions File [nul.def]: LINK : warning L4021: no stack segment 这种方法需要确认连接过程中的各种文件名,如果使用文件名的默认值,那么直接按“回车”键即可。在上面四个文件名中,最重要二个文件名是:执行文件名和库文件名。一般情况下,无需更换最终生成的执行文件名;如果在连接过程中需要其它的库文件,则在显示第三行提示时,输入所需要的库文件名。 最后一行显示一个警告信息,提出本程序没有定义堆栈段,该警告信息可以不必理会,因为该执行文件是可运行的,在操作系统装入时会自动为其添加一个默认的堆栈段。
附录1 汇编语言编程和调试工具 方法2: 在文件名后面加上分号“;”,默认使用各类文件的缺省值。 …>link test; …… 附录1 汇编语言编程和调试工具 方法2: 在文件名后面加上分号“;”,默认使用各类文件的缺省值。 …>link test; …… LINK : warning L4021: no stack segment 4、运行程序 当要运行所生成文件时,可直接输入其文件名即可。 …>test 5、符号调试程序 当程序的运行结果不是预期结果时,就需要调试程序,找出错误的语句或逻辑关系。MASM系统提供了可用于源程序一级的调试工具CV(CodeView)。有关CV的使用参见“调试工具”中CodeView的介绍。 例1.7:用符号调试工具CV来调试程序TEST.ASM所生成可执行文件。 …>masm /Zi /Zd test ;假设其没有语法错 …>link /Co test …>cv test.exe
附录1 汇编语言编程和调试工具 二、编程集成环境PWB 附录1 汇编语言编程和调试工具 二、编程集成环境PWB PWB(Programmer's WorkBench)是MASM 6.11提供的编程集成环境,在此环境下,程序员可直接编写源程序、汇编、连接和运行。 在汇编源程序时,如果有错误,系统将列举出所有出错位置和出错原因。还可用Shife+F3和Shife+F4来定位前一个错误和后一个错误; 在连接时,可指定堆栈的大小、附加的库文件、符号跟踪等选项; 在运行时,可设置命令行参数、直接运行、按调试方式运行、用DOS命令来运行等。 例1.8:查看PWB的启动方式 …>pwb /? 通常情况下,在PWB后面跟一个将要编辑的源文件名。假如要编辑源文件TEST.ASM,那么,可直接输入下面命令: …>pwb test.asm
附录1 汇编语言编程和调试工具 1、编辑源文件 PWB的编辑功能与许多编辑器的功能类似,有:建立新文件、保存文件、另存为、光标移动功能、块操作、插入/删除操作、恢复操作、查找/替换操作、设置编辑器的功能键和各类颜色等。要想了解更全面的编辑功能,可查看菜单:File、Edit、Search和Options的前四个菜单项。 在画面1.1(Options菜单中的“Colors…”)中,可选择各类窗口、菜单和文本等对象的背景色和前景色。比如:当要改变源程序的显示颜色时,可先在左边的列表框中选择“Text”列表项,然后再选择其背景色和前景色。
附录1 汇编语言编程和调试工具
附录1 汇编语言编程和调试工具 在连接时,如果需要某个库文件,那么,可选用Options菜单中的“Link Options”菜单项来设置,该菜单项的显示画面如画面1.2所示 在该画面上还可为程序设置一个缺省的堆栈段,其大小也可由用户自行决定。
附录1 汇编语言编程和调试工具 当生成执行文件需要多个模块连接时,就需要建立一个工程文件(.MAK)。建立工程文件的步骤和画面如下: 附录1 汇编语言编程和调试工具 当生成执行文件需要多个模块连接时,就需要建立一个工程文件(.MAK)。建立工程文件的步骤和画面如下: (1)、输入工程文件名,其默认的后缀为.MAK。输入画面如画面1.3所示 在画面1.3中还可选择工程目标文件的类型,该类型有:EXE、COM、LIB、Windows的EXE或DLL等二十几种。当然,对每种类型又有一些不同的要求,在此不在进一步展开叙述了。通常情况下,不必选择目标文件类型,其缺省类型就是DOS EXE。
附录1 汇编语言编程和调试工具 (2)、工程文件的编辑 附录1 汇编语言编程和调试工具 (2)、工程文件的编辑 在画面1.3中输入工程文件名,并且按“OK”按钮时,系统将进入画面1.4,在该画面中可向当前工程中添加源程序,也可把某源程序从当前工程中删除。
附录1 汇编语言编程和调试工具 若输入的文件名不在工程文件中时,可把该源文件添加到工程文件中,若在,也可将其从工程文件中删除。当所需要的源文件都添加到当前工程文件中时,可按“Save List”来保存该工程文件。此后就可用打开工程文件的方式来连接该工程中的文件。 如果需要修改工程文件的话,则可先用Project菜单中的“Open Project”菜单项打开工程文件,再用“Edit Project”菜单项来激活画面1.4进行编辑。 (3)、运行程序 在运行程序时,可设置命令行参数、直接运行、按调试方式运行、用DOS命令来运行等。通常情况下,在编写程序的初期,一般都用“调试方式”来运行程序。当选用这种方式时,系统会自动进入CV(CodeView)的调试环境。有关CV的使用参见“调试工具”中CodeView的介绍。
附录1 汇编语言编程和调试工具 (4)、符号调试的设置步骤 附录1 汇编语言编程和调试工具 (4)、符号调试的设置步骤 编写程序很难做到:编辑、汇编、连接、运行一次完成,除非程序的功能非常简单。当运行的结果不符合要求时,就需要跟踪程序的运行。 常用的调试手段有二种:执行代码的调试和符号调试。 前者是在没有任何源程序信息的情况下进行的调试,其工作难度大、效率低,后者是源程序一级上进行的调试,其目标代码的执行过程就象是源程序的执行,这种调试手段效率高、调试难度低,也是目前最流行的调试手段(在各种编程环境下都有类似的调试工具)。 一般来说,跟踪程序执行的工作又称为调试程序,即找出程序中不正常的逻辑关系和语句。
附录1 汇编语言编程和调试工具 为了能进行符号调试,需要告诉汇编程序和连接程序保留源程序中的各种符号信息。为此,可通过下面三步来设置一些命令选项。 (1)、设置生成选项 选择Options菜单中的“Build Options”菜单项,显示出画面1.5,并选择其中的“Use Debug Options”选项。
附录1 汇编语言编程和调试工具 (2)、设置汇编命令的选项 附录1 汇编语言编程和调试工具 (2)、设置汇编命令的选项 选择Options菜单中的“Project Templates”→“Customize Project Template”菜单项,显示出画面1.6。 在该画面的“Build Rule List”列表框中选择“macro AFLAGS_D “””,并把它修改为“macro AFLAGS_D “/Zi /Zd””。
附录1 汇编语言编程和调试工具 (3)、设置连接命令的选项 附录1 汇编语言编程和调试工具 (3)、设置连接命令的选项 选择Options菜单中的“Link Options”菜单项,与画面1.2所对应的是同一个画面,在此所要的部分画面如画面1.7所示,并选择“CodeView”选项。 经过上面三步设置后,在PWB环境下,用Run菜单中的“Debug”菜单项就可进行符号调试了。
附录1 汇编语言编程和调试工具 三、MASM的安装 附录1 汇编语言编程和调试工具 三、MASM的安装 宏汇编系统MASM 6.11共有5张软盘:Disk1~Disk5。在Disk1中运行Setup.exe文件即启动系统的安装过程。其安装过程与许多系统的安装大同小异,只有用户根据屏幕提示作适当的选择即可,所以,在此省略系统安装具体步骤的描述。
附录1 汇编语言编程和调试工具 1.1.2、Turbo Assember 附录1 汇编语言编程和调试工具 1.1.2、Turbo Assember Turbo Assenmer系统是Borland C++程序设计系统的一部分,可有选择地安装它。该汇编系统有三个主要文件:TASM.EXE、TLINK.EXE、TD.EXE和TD32.EXE,其中:TD.EXE是16位程序的调试器,它只能显示16位寄存器,而TD32.EXE是32位程序的调试器。有关它们的显示画面请参见画面2.2和2.3。 Turbo Assenmer系统在汇编语言程序设计方面主要采用命令行的形式,当用其它文本编辑器编写好源程序(后缀为:.ASM)后,即可用TASM和TLINK文件来处理它。 一、汇编源程序 TASM.EXE 16-bit real-mode assembler TASMX.EXE 16-bit protected-mode assembler TASM32.EXE 32-bit protected-mode assembler
附录1 汇编语言编程和调试工具 例1.9 查看TASM的功能选项 …>tasm /? …… 附录1 汇编语言编程和调试工具 例1.9 查看TASM的功能选项 …>tasm /? …… /zi,/zd,/zn Debug info: zi=full, zd=line numbers only, zn=none 例1.10 汇编已有源程序TEST.ASM …>tasm test 假如源文件TEST.ASM有语法错的话,可用下面命令来生成其列表文件TEST.LST。 …>tasm test,,test …>type test.lst | more 假如源文件没有语法错,那么可用TLINK.EXE连接它,以生成可执行文件。
附录1 汇编语言编程和调试工具 二、连接程序 例1.11 查看TLINK的功能选项 …>tlink /? …… 附录1 汇编语言编程和调试工具 二、连接程序 例1.11 查看TLINK的功能选项 …>tlink /? …… /n Ignore default libraries /f Inhibit optimizing far calls to near /v Full symbolic debug information /Gx Goodies 例1.12 连接汇编得到的目标文件TEST.OBJ …>tlink test 三、符号调试程序 当程序的运行结果不是预期结果时,就需要调试程序,找出错误的语句或逻辑关系。Turbo Assember系统提供了可用于源程序一级的调试工具TD/TD32(Turbo Debuger)。有关TD的使用参见“调试工具”中Turbo Debuger的介绍。
附录1 汇编语言编程和调试工具 例1.13:用符号调试工具TD来调试程序TEST.ASM所生成可执行文件。 附录1 汇编语言编程和调试工具 例1.13:用符号调试工具TD来调试程序TEST.ASM所生成可执行文件。 …>tasm /Zi /Zd test ;假设其没有语法错 …>tlink /v test …>td test.exe
附录1 汇编语言编程和调试工具 1.2、调试工具 1.2.1、DEBUG 启动DEBUG的一般命令如下: DEBUG 文件名 [参数表] 附录1 汇编语言编程和调试工具 1.2、调试工具 1.2.1、DEBUG 启动DEBUG的一般命令如下: DEBUG 文件名 [参数表] 其中:文件名指定被调试的文件,其包括名和后缀,参数表是被调试文件运行时所需要的参数。 被调试的文件可以是系统中的任何文件,但通常它们的后缀为.EXE或.COM。 当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种DEBUG命令。DEBUG中标志位的符号表示如表1所示,其所有命令及其含义如表2所示。 表1 DEBUG中标志位的符号表示 标志名称 溢出 OF 方向 DF 中断 IF 负号 SF 零 ZF 辅助进位 AF 奇偶 PF 进位 CF 置位状态 OV DN EI NG ZR AC PE CY 复位状态 NV UP DI PL NZ NA PO NC
附录1 汇编语言编程和调试工具 关于参数的几点说明: 进制:在DEBUG中输入或显示的数据都是十六进制形式 附录1 汇编语言编程和调试工具 关于参数的几点说明: 进制:在DEBUG中输入或显示的数据都是十六进制形式 分隔:命令和参数、参数和参数之间要用空格、逗号或制表符等分隔 地址:用“段值:偏移量”的形式来表示地址,也可用段寄存器来代表“段值” 例如:1000:0,ds:10,es:200,cs:30等 表2 DEBUG命令及其含义 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与“起始地址”指定的同大小区域进行比较,显示不相同的单元 D [范围] 显示指定范围内的内存单元内容 E 地址 字节值表 用值表中的值替换从“地址”开始的内存单元内容 F 范围 字节值表 用指定的字节值表来填充内存区域
附录1 汇编语言编程和调试工具 命令格式 功能说明 G [=起始地址] [断点地址] 从起点(或当前地点)开始执行,到终点结束 附录1 汇编语言编程和调试工具 命令格式 功能说明 G [=起始地址] [断点地址] 从起点(或当前地点)开始执行,到终点结束 H 数值1 数值2 显示二个十六进制数值之和、差 I 端口地址 从端口输入 L [地址 [驱动器号 扇区 扇区数]] 从磁盘读 M 范围 地址 把“范围”内的字节值传送到从“地址”开始的单元 N 文件标识符 [文件标识符…] 指定文件名,为读/写文件做准备 O 端口地址 字节值 向端口输出 P [=地址] [指令数] 按执行过程,但不进入子程序调用或软中断 Q 退出DEBUG,不保存正在调试的文件 R [寄存器名] 显示和修改寄存器内容 S 范围 字节值表 在内存区域内搜索指定的字节值表。如果找到,显示起始地址,否则,什么也不显示 T [=地址] [指令数] 跟踪执行,从起点(或当前地点)执行若干条指令 U [范围] 反汇编,显示机器码所对应的汇编指令 W [地址 [驱动器号 扇区 扇区数]] 向磁盘写内容,(BX、CX)为写入字节数
附录1 汇编语言编程和调试工具 范围:表示地址范围,它有二种表示方式:“地址1 地址2”和“地址1 长度”。 附录1 汇编语言编程和调试工具 范围:表示地址范围,它有二种表示方式:“地址1 地址2”和“地址1 长度”。 其中:“地址1”表示起始地址,要用“段值:偏移量”来表达; “地址2”表示终止地址,只用“偏移量”来表示; “长度”用字母’L’开头的数值来表示。 例如:100:50 100——段值为100,偏移量从50到100的内存区域; 100:50 L100——段值为100,偏移量从50开始的100个字节区域。 端口地址:二位十六进制数值 字节值:二位十六进制数值 字节值表:由若干个字节值组成,也可以是用引号括起来的字符串 驱动器号:0—驱动器A、1—驱动器B、2—驱动器C、3—驱动器D等
附录1 汇编语言编程和调试工具 关于使用命令的几点说明: 1、在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行 附录1 汇编语言编程和调试工具 关于使用命令的几点说明: 1、在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行 2、命令是单个字母,命令和参数的大小写可混合输入 3、可用F1、F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令 4、当命令出现语法错误时,将在出错位置显示“^ Error” 5、可用^C或^Break来终止当前命令的执行,还可用^S来暂停屏幕显示(当连续不断地显示信息时) 例2.1:启动DEBUG,并装入test.exe文件(假设该文件已存在)。 解: 方法1:…\>debug test.exe 方法2:…\>debug -n test.exe -l
附录1 汇编语言编程和调试工具 例2.2:比较以DS为段值,偏移量从10到50的内存区域与从地址100:20开始的内存区域。 附录1 汇编语言编程和调试工具 例2.2:比较以DS为段值,偏移量从10到50的内存区域与从地址100:20开始的内存区域。 -C DS:10 50 100:20 或 -C DS:10 L41 100:20 例2.3:显示以DS为段值,偏移量从10到50内存区域的单元内容,然后用’abc’来填充它。 -D DS:10 50 或 -D DS:10 L41 -F DS:10 50 ‘abc’ 例2.4:显示十六进制1234与3421之和、差。 -H 1234 4321 例2.5:把数据段区域DS:0-40内的内容传送给从附加段ES:10开始的内存中。 -M DS:0 40 ES:10 例2.6:在数据段区域DS:0-40内查找是否有字符串’CIH’。 -S DS:0 40 ‘CIH’
附录1 汇编语言编程和调试工具 1.2.2、CodeView 附录1 汇编语言编程和调试工具 1.2.2、CodeView CodeView是一个简单、直观的全屏幕调试工具,它可调试多种语言的源程序所生成的执行代码。CodeView的调试窗口如画面2.1所示。 画面的左上窗口是调试器的主窗口,其显示被调试的源程序或执行代码,左下窗口是命令窗口,用户可输入各种DEBUG命令,右窗口是显示寄存器窗口,它可显示16位和32位寄存器的内容。当然还有其它窗口,如:内存窗口、查看内容窗口(Watch)和程序输出窗口(View)等。 F2:显示/隐含的寄存器组窗口 F3:以不同的显示方式显示当前执行的程序 F4:显示程序的输出屏幕 F5:执行到下一个逻辑断点,或到程序尾 F6:依次进入当前屏幕所显示的窗口 F7:与F5功能相同 F8:单步执行指令,并进入被调用的子程序 F9:在源程序行中设置/取消断点,用鼠标左键双击之也可 F10:单步执行指令,但不进入被调用的子程序
附录1 汇编语言编程和调试工具 1.2.2、CodeView 附录1 汇编语言编程和调试工具 1.2.2、CodeView CodeView是一个简单、直观的全屏幕调试工具,它可调试多种语言的源程序所生成的执行代码。CodeView的调试窗口如画面2.1所示。 画面的左上窗口是调试器的主窗口,其显示被调试的源程序或执行代码,左下窗口是命令窗口,用户可输入各种DEBUG命令,右窗口是显示寄存器窗口,它可显示16位和32位寄存器的内容。当然还有其它窗口,如:内存窗口、查看内容窗口(Watch)和程序输出窗口(View)等。 F2:显示/隐含的寄存器组窗口 F3:以不同的显示方式显示当前执行的程序 F4:显示程序的输出屏幕 F5:执行到下一个逻辑断点,或到程序尾 F6:依次进入当前屏幕所显示的窗口 F7:与F5功能相同 F8:单步执行指令,并进入被调用的子程序 F9:在源程序行中设置/取消断点,用鼠标左键双击之也可 F10:单步执行指令,但不进入被调用的子程序
附录1 汇编语言编程和调试工具
附录1 汇编语言编程和调试工具 1.2.3、Turbo Debuger 附录1 汇编语言编程和调试工具 1.2.3、Turbo Debuger Turbo Debuger的主要窗口和调试功能键与CV非常类似,也可以单步执行、设置断点、显示寄存器内容和查看内存内容等。具体操作由读者在实际的调试过程中掌握、体会。 画面2.2和2.3是Turbo Assember系统中16位和32位调试器的主要显示画面。
附录1 汇编语言编程和调试工具
谢 谢 计算机科学系 2003年03月20日