宏汇编程序—MASM5.0 动态调试程序DEBUG

宏汇编程序 ----MASM5.0

汇编( Assemble )就是把用汇编语言编写的源程序翻译(汇编)成机器语言的目标程序。其基本工具是汇编程序。可使用小汇编程序( ASM ), 也可以使用微软公司产品宏汇编程序( MASM )。实验推荐使用宏汇编程序,因为它不但可以代替 ASM ,而且可以汇编具有宏定义的汇编程序。
如何编写和汇编语言程序

可以用普通文本编辑器编辑汇编语言源程序。常用的有 MS-DOS 下的 EDIT 文本编辑程序, Windows 下的写字板( WORDPAD.EXE )等。用户通过屏幕编辑程序键入源程序,检查无误,可将源程序存到汇编系统盘上,该程序的扩展名为· ASM 。

软件运行基本环境

运行汇编程序必备的软件环境: DOS 操作系统;汇编系统。

汇编系统盘应包含如下文件:

MASM 宏汇编程序文件

LISK 连接程序文件

CRFF 索引程序文件(也可不用)

汇编源程序编写

1 )源程序的书写格式

当 CPU 访问内存时,是把存储器分成若干个段,通过 4 个段寄存器中存放的地址对内存储器访问,因此在编源程序时必须按段的结构来编制程序。由于每个段的物理空间为≤ 64KB ,所以程序中各段可以分别为一个或几个。源程序的书写一般有如下形式:

逻辑堆栈段 堆栈段名 SEGMENT STACK

用变量定义预置的堆栈空间

·

·

堆栈段名 ENDS

逻辑数据段 数据段名 SEGMENT

用变量定义预置的数据空间

·

·

数据段名 ENDS

逻辑代码段 代码段名 SEGMENT

ASSUME 定义各段寻址关系

过程名 PROC …

程序

·

·

过程名 ENDP

代码段名 ENDS

END 过程名或起始标号

在源程序中最少要有一个代码段,数据段根据需要可有可无,也可以增设附加段。对于堆栈段也可以根据需要可有可无,但在连接( LINK )时计算机将显示警告性的错误:

Warning : N STACK segment

There was 1 error detected.

在程序中如果没有用到堆栈时,该错误提示不影响程序的运行,如果程序中用到堆栈时必须设置堆栈段。

其中: SEGMENT 、 ASSUME 、 PROC … ENDP 为伪指令,伪指令是发给汇编程序 ASM 的,而不和微处理器打交道,在汇编时不产生目标代码,只是把源程序中各段的设置情况告诉汇编程序。

2 )段寄存器的段地址的装入

Assume 伪指令语句只是建立了当前段与段寄存器的联系,但不能把各段的段地址装入相应的段寄存器中,段寄存器的段地址的装入是在程序中完成的。

( 1 ) DS 、 ES 、 SS 的装入

由于段寄存器不能用立即数寻址方式直接传送,所以段地址装入可通过通用寄存器传送给段寄存器。

MOV AX ,逻辑段名

MOV 段寄存器, AX

其中逻辑段名为程序中定义各逻辑段的名字,(不包括代码段),段寄存器是指与各逻辑段相对应的各段寄存器( DS 、 ES 、 SS )。

( 2 ) CS 的装入

代码段寄存器是装当前执行目标代码的段地址, IP 是提供下一条要执行的目标代码的偏移量,为了保证程序的正确执行, CS 和 IP 装入新值时是一起完成的。

对 CS 和 IP 的装入有如下几种情况:

①根据用户程序中的伪指令 END 后的标号为 CS 和 IP 提供代码段的段地址和目标代码的偏移地址。

②在程序运行过程中,当执行某些指令和操作时, CPU 自动修改 CS 和 IP 的值,使它们指向新的代码段。

3 )程序中的数据与变量

在汇编源程序中的数据除了立即数,由指令产生的数和通过键盘输入的数以外,还胡大量的数据是通过伪指令语句进行预置和分配的,也就是在某逻辑段中(除代码段),将所需的数据以某种形式存放起来,在程序中可任意调用。在数据定义的同时还可以定义变量,将变量与数据结合在一起。可以为某个变量分配存储空间以便在程序执行过程中存放中间结果和最终结果,使用起来极为方便。

(1)变量与数据的定义

变量与数据的定义可以通过符号定义伪指令 EQU 、=和数据定义伪指令 DB 或 DW 或 DD 来实现。

EQU 和=可以出现在程序的逻辑段内也可出现在逻辑段外。

(2)汇编程序中数据的提供方法

①用数据定义伪指令提供数据

如果程序要求原始数据为一批数据时,用数据定义伪指令 DB 、 DW 和 DD 来提供较为方便。

②用立即数的形式提供数据

当原始数据只有几个时,一般用立即数的方法来提供。当然,用立即数的方法只是将一个数据传送到通用寄存器中,它只是通过通用寄存器传送数据。

③用编程的方法提供数据

假如原始数据是一组有规律的数据项,则用编程序的方法形成这一组数据,不用专门为这组数据分配存储单元,节省了存储空间。

④用键盘提供数据

当原始数据为任意数据时,一般用键盘输入方法,调用 DOS 21H 中断。

(3)数据的输出方式

①在显示器上显示一个字符

调用 02H 号功能调用号,发 21H 号中断,将要显示的字符的 ASCII 码送入 DL ,就可在显示器上显示该字符。

②在打印机上输出一个字符

调用 05H 号功能调用号,发 21H 号中断,将要打印字符的 ASCII 码送入 DL ,就可在打印机上打印出 DL 中的字符。

4) 返回 DOS 状态的方法

当执行 .EXE 文件时,是在 DOS 状态下进行的,如果希望在执行完 .EXE 文件后正常返回 DOS 状态,一般用如下两种方法:采用 DOS 4CH 功能调用和采用返回( RET )断点的方法。

汇编处理 — 执行宏汇编程序 MASM.EXE

用汇编语言编写的源程序必须是一个完整的源程序。宏汇编程序对汇编语言源程序的汇编过程包括语法检查和数据代码汇编两部分,生成目标程序和辅助信息文件。为了完成汇编任务,汇编程序一般采用两遍扫描的方法,第一遍扫描源程序产生符号表、处理伪指令等,第二遍扫描产生机器指令代码、确定数据等。源程序用宏汇编程序翻译(汇编)后,可以得到三个文件:一个是扩展名为 .OBJ 的目标文件,在该文件中,将源程序的操作码部分变为机器码,但地址操作数是可浮动的相对地址,而不是实际地址,因此需经 LINK 连接文件进行连接才能形成可执行文件。第二个文件是列表文件,扩展名为 .LST ,它把源程序和目标程序列表,以供检查程序用。第三个文件是交叉索引文件,扩展名为 .CRF ,它是一个对源程序所用的各种符号进行前后对照的文件。其中目标文件是必须产生的,而其它两个文件在需要时给予命令就可产生,对连接和执行汇编程序无直接的关系。

1 )汇编操作过程

在 DOS 状态下,键入 MASM ↓则调入宏汇编程序,屏幕显示与操作如下:

masm ↓

Microsoft ( R ) Macro Assemble Version 5.00

Copyright ( C ) Microsoft Corp 1981-1985,1987,All right reserved.

Source filename [.ASM ]: MYFILE ↓

Object filename [MYFILE.OBJ ]: MYFILE ↓

Source listing [NUL.LST ]: MYFILE ↓

Cross-reference [NUL.CRF]: MYFILE ↓

50678 + 410090 Bytes symbol space free

0 Warning Errors

0 Severe Errors

其中划线部分为用户键入部分, MYFILE 为源程序名( MYFILE.ASM ),方括号中是机器规定的默认文件名,如果用户认为方括号内的文件名就是要键入的文件名,则可只在划线部分键入回车符。如果不想要列表文件和交叉索引文件,则可在 [NUL.LST ] 和 [NUL.CRF] 后不键入文件名只键入回车符。

当回答完上述四个询问后,汇编程序就对源程序进行汇编。在汇编过程中,如果发现源程序中有语法错误,则提示出错信息,指出是什么性质的错误,错误类型,最后列出错误的总数。之后可重新进入屏幕编辑状态,调入源程序( MYFILE.ASM )进行修改,修改完毕,再进行汇编,直到汇编通过为止。

如果在汇编时不需要产生列表文件( .LST )和交叉索引文件( .CRF ),调用汇编程序时可用分号结束。

如果需要产生 .OBJ 和 .LST 文件,不需要 .CRF 文件,则在分号前面加两个逗号即可。

如果 4 个文件都需要,用简便的操作方法是在分号前用了 3 个逗号。

2 )列表文件( .LST )

列表文件( .LST )是通过汇编程序( MASM )产生的,可以在 DOS 状态下用 TYPE 命令显示或打印该文件,以便分析调试源程序。如显示 D 盘上已存在的列表文件 MYFILE.LST 操作方法如下:

D> TYPE MYFILE . LST ;↓

列表程序由三部分组成:

( 1 )源程序和目标程序清单

列表程序同时列出源程序和对应的机器语言清单。列表程序的第一列给出每条指令所在行号;第二列给出从段的首地址开始的每条指令存放的偏移地址;接着是数字列,给出对应每条语句的机器码和对应于存放在栈段和数据段的值,在机器码加上“ R ”的指令表示:这条指令在连接时可能产生与列出来的偏移地址不同的地址,因为这些偏移地址可能与其它模块有关;最右边就是用汇编语言编写的源程序。

( 2 )段信息汇总表

在段信息汇总表中列出该程序用了哪几个段,如:代码段 CODE 、数据段 DATA 和堆栈段 STACK ;每个段所占存储空间的长度(字节数);每个段的定位类型,包括 PAGE (页)、 PARA (节)、 WORD (字)和 BYTE (字节),它们表示此段的起始边界要求,即起始边界地址应分别可以被 256 、 16 、 2 和 1 除尽。该列表清单 中是以 PARA 为 CODE 段、 DATA 段和 STACK 段的起始边界地址。最后一列为段的组合类型;段的组合类型是告诉连接程序,本段与其它段的关系,组合类型有 NONE 、 PUBLIC 、 COMMOM 、 AT 表达式、 STACK 和 MEMORY 。

NONE :表示本段与其它段不发生逻辑关系,即每段都有自己的基本地址。是隐含组合类型。

STACK :表明连接程序首先要把本段与同名同类别的其它段相邻地连接在一起,然后为所有定义为栈段的连接在一起的段,定义一个共同的段基地址,即连接成一个物理段。

在列表程序的源程序中只有一个栈段,在栈段定义中给出了组合类型为 STACK ,因此在段信息汇总表中列出了该项,在本程序中它没有任何意义,因为没有其它栈段与它连接,只是为了说明这个问题而设置的。

( 3 )符号汇总表

在列表程序中最后部分列出了符号汇总,是指在源程序中用户定义的符号名、类型、值和所在段。

如果在源程序中存在某些语法错误时,列表文件可提示某条语句有哪些错误,出错提示显示在出错指令行的下面,因此用户可借助列表文件很快地找到错误行,以便调试。另外由于列表文件给出了各条指令的偏移地址,对和程序时设置断点很方便。

3 )交叉索引文件( . CRF )

汇编后产生的交叉索引文件,扩展名为 . CRF, 它列出了源程序中定义的符号(包括:标号、变量等)和程序中引用这些符号的情况。

如果要查看这个符号表,必须使用 CREF . EXE 的文件,它根据 . CRF 文件建立一个扩展名为 . REF 的文件,而后再用 DOS 的 TYPE 命令显示,就可以看到这个符号使用情况表。具体操作方法如下:

D> CREF ↓

cref filename [.CRF] : MYFILE ↓

list filename [MYFILE.REF] : ↓

D> TYPE MYFILE.REF ↓

目标代码链接程序 ----LINK.EXE

用汇编语言编写的源程序经过汇编程序( MASM )汇编后产生了目标程序( .OBJ ),该文件是将源程序操作码部分变成了机器码,但地址是可浮动的相对地址(逻辑地址),因此必须经过连接程序 LINK 连接后才能运行。连接程序 LINK 是把一个或多个独立的目标程序模块装配成一个可重定位的可执行文件,扩展名为 .EXE 文件。此外还可以产生一个内存映象文件,扩展名为 .MAP 。

1 )连接程序执行过程

在 DOS 状态下,键入 LINK ↓(或 LINK MYFILE ↓)则系统调入 LINK 程序,屏幕显示操作如下:

D> LINK ↓

IBM Personal Computer Linker

Version 2.00 ( C ) Copyright IBM Corp 1981,1982,1983

Object Modules [.OBJ] : MYFILE ↓

Run File [MYFILE.EXE] : MYFILE ↓

List File [NUL.MAP] : MYFILE ↓

Libraries [.LIB] : ↓

其中划线部分为用户键入部分, MYFILE 为源程序名,方括号内为机器默认文件名,当用户认为方括号中的文件名就是要键入的文件名时,可在冒号后面只键入回车。

其中 MAP 文件是否需要建立,由用户决定,需要则键入文件名,不需要则直接送入一个回车键。

最后一个询问是问是否在连接时用到库文件,对于连接汇编语言源程序的目标文件,通常是不需要的,因此直接键入回车键。

与汇编程序一样,可以在连接时用分号结束后续询问。

例如:

D> LINK MYFILE ;↓

IBM Personal Computer Linker

Version 2.00 ( C ) Copyright IBM Corp 1981,1982,1983

连接后只产生 MYFILE.EXE 文件。如果除 MYFILE.EXE 文件外还要产生 MYFILE.MAP 文件,则在分号前加两个逗号。

D> LINK MYFILE ,,;↓

IBM Personal Computer Linker

Version 2.00 ( C ) Copyright IBM Corp 1981,1982,1983

2 )内存映象文件( .MAP )

由连接程序 LINK 产生的扩展名为 .MAP 文件,它实际上是连接程序的列表文件,它给出了每个段的地址分配情况及长度。

在 DOS 状态下,用 TYPE 命令显示打印出来。例如:

D> TYPE MYFILE.MAP ↓

Start Stop Length Name Class

00000H 0000FH 0010H DATA

00010H 0004FH 0040H STACK

00050H 0005FH 0010H CODE

Origin Group

Program entry point at 0005:0000

从中可以看到,源程序 MYFILE 中定义了三个段:数据段( DATA )起始地址为 00000H ,终止地址为 0000FH ,长度为 0010H 个字节;堆栈段( STACK )起始地址为 00010H ,终止地址为 0004FH ,长度为 0040H 个字节;代码段( CODE )起始地址为 00050H ,终止地址为 0005FH ,长度为 0010H 个字节。

应用程序执行

当用连接程序 LINK 将目标程序( .OBJ )连接定位后,可产生可执行的应用程序文件( .EXE ),可以在 DOS 状态下执行该程序。

执行操作如下:

D> MYFILE ↓ 或

D> MYFILE.EXE ↓

在源程序 MYFILE 中如果有显示结果的指令,则在执行程序后可以看到执行结果;如需要动态调试应用程序 MYFILE.EXE ,则可以借助动态调试程序 DEBUG.COM 来进行调试、运行, DEBUG 是一种支持命令行方式的汇编语言编程调试工具。


版权所有:西北师范大学物电学院电子信息工程系
Tel: 0931-7971503;E-mail: songhs@nwwnu.edu.cn
最佳浏览方式:IE 5.0以上浏览器,1024*768分辨率