第十一章 汇编语言程序的开发 第一节 汇编语言程序的开发过程 .ASM .EXE .MAP .LST .CRF .OBJ 开始 编辑程序 第十一章 汇编语言程序的开发 第一节 汇编语言程序的开发过程 开始 编辑程序 源程序 文件 宏汇编程序MASM 语法有错? 目标程序 连接程序LINK 可执行 调试程序DEBUG 程序正确? 结束 Y N .OBJ .ASM .EXE .MAP .LST .CRF
第二节 编辑 编辑就是将源程序输入到计算机中的过程。 编辑工具软件很多,只要能够以ASCII码格式保存文件的编辑程序都可以使用。常用的编辑程序有:写字板、记事本、 WORD等等。 注意:在很多的编辑程序中,当文件编辑输入完成后,可以用多种存储格式保存。但对于汇编语言源程序,必须使用ASCII格式,即纯文本格式进行 存储。
第三节 汇编 汇编就是把用汇编语言编写的源程序翻译成机器语言的目标程序。 MASM称为宏汇编程序,它包含有宏功能的处理,是一个常用的汇编程序。 汇编语言源程序经MASM汇编后,可以产生3个文件:目标文件(.OBJ)、列表文件(.LST)、交叉引用文件(.CRF)。
有两种调用MASM对汇编语言源程序进行汇编的方法: 1、提示应答方式 在DOS操作系统提示符下键入MASM〈回车〉,或直接从WINDOWS操作系统中,双击MASM.exe文件。 系统在显示版本号后,接着依次显示提示信息,并等待用户的输入。按照提示信息,键入相应的文件名,并按回车。如果默认系统给定的选择,则只需要按回车键。 Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp.1981-1985,1987,Allrights reserved Source filename [.ASM]: EXAMPLE<回车> Object filename [EXAMPLE]:<回车> Source listing [NUL.LST]: <回车> Cross-reference [NUL.CRF]:<回车> 例如:
如果在系统显示的提示信息后,输入了分号“;”,则表示后面的所有提示行都确认使用默认选择,并不再显示。 Source filename [.ASM]: EXAMPLE;<回车> 例如: 在结束提示应答后,MASM就对源程序进行扫描和语法检查。在没有严重语法错误的情况下,将生成.OBJ文件。若有语法错误将显示错误信息。
命令行方式是指在DOS状态下,将执行宏汇编MASM程序时所需要的所有文件名按照指定的格式,输入在一个命令行中。常用的命令格式为: 2. 命令行方式 命令行方式是指在DOS状态下,将执行宏汇编MASM程序时所需要的所有文件名按照指定的格式,输入在一个命令行中。常用的命令格式为: MASM <Sourcefile> [, [OBJfile] [,LSTfile] [,CRFfile ] ] ] [ ; ]<回车> (1)命令行格式中文件名的顺序应严格与命令格式指定的顺序一致。 (2)如果希望生成的目标文件、列表文件或交叉引用文件与源程序文件同名(扩展名不同),则可以不给出文件名,只需要在对应的位置输入逗号。 (3)如果在指定某文件后,直接键入分号“;”,则表明命令结束,其后都选定默认文件名。
例如: C:\MASM\> MASM EXAMPLE, , , <回车> 它表示对源程序EXAMPLE.ASM进行汇编,并按照默认约定生成目标文件EXAMPLE.OBJ,列表文件EXMAPLE.LST 和交叉引用文件EXAMPLE.CRF。 C:\MASM\> MASM EXAMPLE, ,<回车> 它表示对源程序EXAMPLE.ASM进行汇编,并按照默认约定生成目标文件EXAMPLE.OBJ,列表文件EXMAPLE.LST,但不生成交叉引用文件。
第四节 连接 由汇编程序生成的目标程序是不能直接运行的,必须将目标文件进行连接后,生成一个可执行文件(.EXE),才能运行该程序。 第四节 连接 由汇编程序生成的目标程序是不能直接运行的,必须将目标文件进行连接后,生成一个可执行文件(.EXE),才能运行该程序。 连接程序LINK.EXE能够把一个或多个独立的目标文件和定义在库文件(.LIB)中的子程序与变量,连接装配成一个可重定位的可执行文件(.EXE) 在连接过程中,除了生成可执行文件(.EXE)外,还可以根据用户的指定,生成相应的内存映像文件(.MAP)
一、LINK的操作 LINK的使用与MASM类似,也有提示应答方式和命令行两种使用方式。 1、提示应答方式 在DOS操作系统提示符下键入LINK〈回车〉,或直接从WINDOWS操作系统中,双击LINK.EXE文件。 系统将依次显示目标模块文件名、可执行文件名、映像文件名和库文件名等提示信息。 C:\MASM>LINK Microsoft (R) Corp. Overlay Linker Version 3.60 Copyright (C) Microsoft Corp. 1983-1987,All rights reserved Object Modules [.OBJ]:EXAMPLE<回车> Run file [EXAMPLE.EXE]: <回车> List file [NUL.MAP]: <回车> Libraries [.LIB]: <回车>
对于多个目标文件的连接,输入文件名时,文件名之间使用加号“+”。例如: Object Modules [.OBJ]:file1+file2+file3<回车> 2、命令行方式 LINK的命令行方式格式为: LINK OBJfiles [, EXEfile] [, [MAPfile] [,[Libraries] ] ] ] [ Options][;] 例如:C:\MASM> LINK EXAMPLE;<回车> 在连接中,可能因某种原因而导致错误的发生。这时应根据错误信息显示,确定发生错误的原因,并进行修改。然后再重新汇编、连接,直到正确第完成连接操作。
二、内存映像文件 内存映像文件是在连接目标文件时,如果指定了相应的选择项,而生成的。它的扩展名为MAP。 内存映像文件中包含了程序中定义的段的起始地址、结束地址、长度、段名和类别名。 下面是一个示例: Start Stop Length Name Class 00000H 00011H 00012H DATA DATA 00020H 0005FH 00040H STACK STACK 00060H 00077H 00018H CODE CODE 在调试较大的程序时,使用MAP文件中的相关信息将会给调试工作带来很大的帮助。
第五节 调试与运行 调试的主要任务就是检查和修改程序中的错误。 程序中的错误可分为两类:语法错误和逻辑错误 语法错误在程序的汇编和连接过程中都会被发现。而程序的逻辑错误在这两个过程中是发现不了的。需要使用一定的调试工具软件,进行仔细认真的调试才能发现。 汇编语言程序调试中常用的一个工具软件是DEBUG。下面介绍DEBUG软件的使用基础。
一、DEBUG的启动与退出 DEBUG的启动方法有两种: 1. 在DOS状态下输入DEBUG命令 进入DEBUG状态后,系统的提示符将变为“-”。这时用户可以输入各种DEBUG命令。 2.在DOS状态下输入DEBUG命令的同时,指定要调试的文件名。 例如:C\>DEBUG EXAMPLE.EXE<回车> 然后在DEBUG状态下可以对装载的文件进行各种操作。
二、DEBUG常用命令 一个DEBUG命令为一个字母,其后空一格,可以再跟一些参数。DEBUG中的数字用的是十六进制,不必加H 1.装载用户程序 要对程序进行调试,首先需要将程序文件装入内存。在进入DEBUG状态后,装载程序方法是,先使用N命令指定文件名,再用L命令将指定的文件装入内存。
格式:N 文件名 文件名需指定扩展名。如果需要还应指明盘符和路径。 格式:L 将由N命令指定的文件装入到内存中。 例如: -N TEST.EXE -L
2. 退出DEBUG 格式:q 退出DEBUG
DEBUG命令中的参数多数为地址或者地址范围. 地址书写格式为: [段基值]:偏移地址 地址范围的书写格式为: [段基值]:起始偏移地址 终止偏移地址 [段基值]:起始偏移地址 L长度 段基值可用寄存器名或者十六进制的数。段基缺省为DS 3. D(Dump)命令 格式:D [地址] 格式:D 地址范围 功能:显示指定地址范围内的内存单元 的内容。
例如: -D -D 200 2FF -D 200 L 100 -D DS:200 -D 0FDAB:200
3. R(Register)命令 格式:R[寄存器名] 功能:显示CPU中的一个或所有16位寄存器的内容。标志寄存器的内容为各标志位的状态(置位/复位),每个状态用两个字符来表示。 标志位 置 位(1) 复 位(0) 溢出位OF OV NV 方向位DF DN UP 中断位IF EI DI 符号位SF NG PL 零值位ZF ZR NZ 辅助进位AF AC NA 奇偶位PF PE PO 进位位CF CY NC
4. A(Assemble)命令 格式:A [地址] 功能:将从键盘直接输入的汇编指令翻译成目标代码,并存放在内存单元中。 参数地址是用来存放目标代码的起始地址。 利用此命令可以方便地用DEBUG来调试简单的指令序列。 5. U(Unassemble)命令 格式:U [地址]/[地址范围] 功能:将指定内存中的目标代码反汇编成8086/8088的汇编指令格式在屏幕上显示出来。
6. G(Go)命令 格式:G [=起始地址] [断点地址1,断点地址2,…] 功能:从起始地址执行程序,直到程序结束或遇到断点为止。 如果不指定起始地址,则从CS:IP处开始执行。如果执行到结束,则显示“Program Terminated normally”。如果遇到断点,则停止执行,并显示寄存器状态。
7. 单步执行命令T和P 这两个命令是逐条跟踪指令的运行。它们的区别是T命令对于子程序调用指令的执行,将转入相应的子程序内部,而P命令则将整个子程序作为一条指令来执行。 格式:T [=地址] [指令条数] 格式:P [=地址] [指令条数]
8. 十六进制算术运算命令H 格式:H 值1 值2 显示十六进制数值1与值2的和与差。
9. 修改内存单元命令E 格式:E 地址,内容表 内容表可以是以逗号或空格分割的两位十六进制数,也可以是用引号括起来的字符串,或是二者的组合 格式:E 地址 再修改数据时可用下列的键进行操作: 键入空格 修改后一个字节单元的内容 键入- 另起一行,修改前一个字节单元的内容 回车结束修改
10. 填充内存命令F 格式:F 地址范围,内容表 将内容表的字符逐个填入指定的地址范围,内容表中的内容用完后,重复使用。 内容表可以是以逗号或空格分割的两位十六进制数,也可以是用引号括起来的字符串,或是二者的组合