如何编写和汇编语言程序
可以用普通文本编辑器编辑汇编语言源程序。常用的有 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 的装入有如下几种情况:
1根据用户程序中的伪指令 END 后的标号为 CS 和 IP 提供代码段的段地址和目标代码的偏移地址。
2在程序运行过程中,当执行某些指令和操作时, 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 是一种支持命令行方式的汇编语言 编程调试工具。
动态调试程序 DEBUG.COM
在编写和运行汇编程序的过程中,会遇到一些错误和问题,需要对程序进行分析和调试,调试程序 DEBUG 就是专为 汇编语言设计的一种调试工具。它在调试汇编语言程序时有很强的功能,能使程序设计者接触到机器内部,能观察和 修改寄存器和存储单元内容,并能监视目标程序的执行情况,使用户真正接触到 CPU 内部,与计算机产生最紧密的 工作联系。
动态和程序 DEBUG 的主要特点
DEBUG 的执行
DEBUG 命令格式
主要 DEBUG 命令
动态和程序 DEBUG 的主要特点
1 )能够在最小环境下运行汇编程序
在 DOS 状态下运行汇编程序,必须将程序经过 MASM 汇编程序,而后还要经过 LINK 连接程序产生可执行程序,才 能最终运行,比较麻烦。在 DEBUG 状态下,为用户提供了调试、控制测试的环境,可以在此环境下进行编程、调试、 监督、执行用户编写的汇编程序。因此调试周期短,为用户提供了极大的方便。
2 )提供极简单的修改手段
DEBUG 提供了修改命令,可以修改内存单元内容,修改寄存器的内容,为调试程序、修改程序带来了方便。
3 )提供用户与计算机内部联系的窗口
DEBUG 具有显示命令,它既可以使用户看到某内存单元或某一块单元内容,也可以看到 CPU 内部各寄存器的内容。 用单步执行命令实现跟踪执行,每执行一步都使用户看到各寄存器的内容的变化,以便分析和调整程序。
4 )可装入、修改或显示任何文件
当然在 DEBUG 状态下运行汇编程序也具有一定局限性。在 DEBUG 状态下运行的程序不能使用宏汇编程序中的宏指令, 大部分伪指令也不能使用,因此只能把程序分段调试。此外,不能调试太长的程序,只能分块进行中程序设计。在 DEBUG 状态下调试好的程序不能形成可执行文件( .EXE ),因此调试好的程序只能记下,到编辑环境下重新键入调 试好的程序,通过汇编程序(如 MASM ),再通过连接程序( LINK )形成可执行文件( .EXE )。
DEBUG 的执行
在操作系统( DOS 或 WIndows )命令行方式下,直接调入 DEBUG 程序,键入命令的格式如下:
D>DEBUG [d:][Path][filename[.ext]][Parm1][Parm2]
其中 [] 的内容为可选项,可以有也可以缺省。
[d:] 为驱动器号,指要调入 DEBUG 状态的可执行文件在哪个驱动器中,如 A: 、 B: 、 C: 等。
[Path] 为路径,指要调入 DEBUG 状态的可执行文件是在哪个目录下或子目录下。
[filename[.ext]] ,指要调入 DEBUG 状态下的可执行文件的文件名,该文件可以是通过编辑、汇编、连接后产生的 可执行文件,也可以是在 DEBUG 状态下汇编的程序 段,通过写盘命令 W 写入磁盘的文件。
[Parm1][Parm2] 为任选参数,是给定文件的说明参数。
在启动 DEBUG 时,如果输入 filename (文件名),则 DEBUG 程序把指定文件装入内存,用户可以通过 DEBUG 的 命令对指定文件进行修改、显示或执行。如果没有文件名,则是以当前内存的内容工作,或者用命名命令或装入命令 把需要的文件装入内存,然后再通过 DEBUG 命令进行修改、显示或执行。
当启动 DEBUG 程序后,屏幕上出现“—”,说明系统已进入 DEBUG 状态。
DEBUG 命令格式
( 1 ) DEBUG 命令都是一个英文字母,后面跟着一个或多个有关参数。多个操作参数之间用“ , ”或空格隔开。 ( 2 ) DEBUG 命令必须接着按 ENTER 键,命令才有效。
(3)参数中不论是地址还是数据,均用十六进制数表示,但十六进制数据后面不要用“ H ”。
(4)可以用 Ctrl 和 Break 键来停止一个命令的执行,返回到 DEBUG 的提示符“—”下。
(5)用 Ctrl - Num Lock 键中止正在上卷的输出行,再通过按任意键继续输出信息。
主要 DEBUG 命令
( 1 )汇编命令 A
格式: a. A [ 段寄存器名 ]:[ 偏移地址 ]
b. A [ 段地址 ]:[ 偏移地址 ]
c. A [ 偏移地址 ]
d. A
功能:用该命令可以将汇编语言程序直接汇编进入内存。
当键入 A 命令后,显示段地址和偏移地址等待用户键入汇编指令,每键入一条汇编指令回车后,自动显示下一条指 令的段地址和偏移地址,再键入下一条汇编指令,直到汇编语言程序全部键入,又显示下一地址时可直接键入回车返 回到提示符“-”为止。
其中 a 的段地址在段地址寄存器中,因此在使用该命令时必须将段地址寄存器送入段地址, c 的地址在 CS 中, d 的段地址在 CS 中,偏移地址为 100H 。
( 2 )显示内存命令 D
格式: a. D [ 地址 ]
b. D [ 地址范围 ]
c. D
功能:显示指定内存范围的内容。
显示的内容为两种形式:一种为十六进制内容,一种为与十六进制相对应的 ASCII 码字符,对不可见字符以“·” 代替。
对于 a 、 c 每次显示 128 个字节内容, b 显示的字节数由地址范围来决定。
若命令中有地址,则显示的内容从指定地址开始,若中中无地址(如 c )则从上一个 D 命令所显示的最后一个单元 的下一个单元开始。若以前没有使用过 D 命令,则以 DEBUG 初始化的段寄存器的内容为起始段地址,起始偏移地址 为 100H ,即 CS:100 。
对于 a 中的地址为偏移地址,段地址为 CS 的内容,对 b 中的地址范围,可以指定段地址和起始偏移地址和终止偏 移地址。
( 3 )修改存储单元内容命令 E
格式: a · E [ 地址 ] [ 内容表 ]
b · E [ 地址 ]
功能: a ·用命令所给定的内容表去代替指定地址范围的内存单元内容。
b ·一个单元一个单元地连续修改单元内容。
其中:内容表为一个十六进制数,也可以是用单引号括起的一串字符。
( 4 )填充内存命令 F
格式: F [ 范围 ][ 单元内容表 ]
功能:将单元内容表中的内容重复装入内存的指定范围内。
( 5 )内存搬家命令 M
格式: M [ 源地址范围 ][ 目标起始地址 ]
其中源地址范围和目的起始地址为偏移地址,段地址为 DS 的内容。
功能:把源地址范围的内容搬至以目标起始地址开始的存储单元中。
( 6 )比较命令 C
格式: C [ 源地址范围 ] , [ 目标地址 ]
其中源地址范围是由起始地址和终止地址指出的一片连续的存储单元,目标地址为与源地址所指单元对比的目标地址 起始地址。
功能:从源地址范围是由起始的地址单元开始逐个与目标起始地址往后的单元顺序比较每个单元内容,比较到源终止 地址为止。比较结果如果一致则不显示任何信息,如果不一致,则以 [ 源地址 ][ 源内容 ][ 目的内容 ][ 目的地 址 ] 的形式显示失败单元地址及内容。
( 7 )搜索指定内容命令 S
格式: S [ 地址范围 ][ 表 ]
功能:在指定地址范围内搜索表中内容,搜索到就显示表中元素所在地址。
( 8 )检查和修改寄存器内容命令 R
格式: a · R
b · R [ 寄存器名 ]
功能: a ·显示 CPU 内部所有寄存器的内容和全部标志位的状态。
b ·显示和修改一个指定寄定器的内容和标志位的状态。
其中对状态标志寄存器 FLAG 以位的形式显示,显示时, 8 个状态标志的显示次序和符号如表 B - 1 所示。 表 B - 1 状态标志显示形式
标 志 位
状 态
显示形式(置位 / 复位)
溢出标志 OF 方向标志 DF 中断标志 IF 符号标志 SF 零标志 ZF 辅助进位 AF 奇偶标志 PF 进位标志 CF
( 9 )跟踪与显示命令 T
有 / 无 OV/NV
增 / 减 DN/UP
开 / 关 EI/DI
负 / 正 NG/PL
零 / 非 ZR/NZ
有 / 无 AC/NA
偶 / 奇 PE/PO
有 / 无 CY/NC
格式: a · T[ =地址 ] 或 T [ 地址 ]
b · T[ =地址 ][ 条数 ] 或 T [ 地址 ][ 条数 ]
功能: a ·执行一条指定地址处的指令,停下来,显示 CPU 所有寄存器内容和全部标志位的状态,以及下一条指令 的地址和内容。
b ·为多条跟踪命令,从指定地址开始;若命令中用 [ 地址 ] 给定了起始地址,则从起始地址开始,若未给定,则 从当前地址( CS:IP )开始,执行命令中的 [ 条数 ] 决定一共跟踪几条指令后返回 DEBUG 状态。
( 10 )反汇编命令 U
格式: a · U [ 地址 ]
b · U [ 地址范围 ]
功能:将指定范围内的代码以汇编 语言形式显示,同时显示该代码位于内存的地址和机器。
若在命令中没有指定地址则以上一个 U 命令的最后一条指令地址的下一个单元作为起始地址;若没有输入过 U 命令, 则以 DEBUG 初始化段寄存器的值作为段地址,以 0100H 作为偏移地址。
(11) 命名命令 N
格式: N 文件名
功能:在调用 DEBUG 时,没有文件名,则需要用 N 命令将要调用的文件名格式化到 CS:5CH 的文件控制块中,才能 用 L 命令把它调入内存进行调试(其它形式参考 DOS 手册)。
( 12 )读盘命令 L
格式: a · L [ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所读扇区个数 ]
b · L [ 地址 ]
c · L
功能: a ·把指定驱动器和指定扇区范围的内容读到内存的指定区域中。其中地址是读入内存的起始地址,当输入 时没有给定地址,则隐含地址为 CS:100H 。起始扇区号指逻辑扇区号的起始位置。所读扇区个数是指从起始扇区号 开始读到内存几个扇区的内容。驱动器号为 0 或 1 , 0 表示 A 盘, 1 表示 B 盘。
b ·读入已在 CS:5CH 中格式化的文件控制块所指定的文件。在使用该命令前用 N 命令命名即可将要读入的文件名 格式化到 CS:5CH 的文件控制块中,其中地址为内存地址。
c ·同 b ·地址隐含在 CS : 100H 中。
当读入的文件有扩展名 .COM 或 .EXE ,则始终装入 CS:100H 中,命令中指定了地址也没用。
其中 BX 和 CX 中存放所读文件的字节数。
(13) 写盘命令 W
格式: a · W[ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所写扇区个数 ]
b · W[ 地址 ]
c · W
功能: a · 把在 DEBUGU 状态下调试的程序或数据写入指定的驱动器中 , 起始扇区号 , 所写扇区个数为要占盘中 几个扇区。
写盘指定扇区的操作应十分小心,如有差错将会破坏盘上的原有内容。
如果在命令行中的地址只包含偏移地址, W 命令认为段地址在 CS 中。
b ·当键入不带参数的写盘命令时, ( 或只键入地址参数的写盘命令 ) ,写盘命令把文件写到软盘上。该文件在用 W 命令之前用命名命令 N 将文件格式化在 CS:5CH 的文件控制块中。
c ·只有 W 命令以前而没有任何参数时,与 N 配合使用进行写盘操作。
在用 W 命令以前在 BX 和 CX 中应写入文件的字节数。
( 15 )输出命令 O
格式: O[ 端口地址 ] [ 字节值 ]
功能:向指定端口地址输出一个字节。
( 16 )运行命令 G
格式: G [ =地址 ][ 地址 [ 地址… ]]
功能:执行用户正在调试的程序。
其中地址为执行的起始地址,以 CS 中内容作为段地址,以等号后面的地址为偏移地址。再后面的地址为断点地址。 在命令行中只有起始地址,没有断点地址,则程序在执行时不中断。 DEBUG 规定最多设置 10 个断点地址。设置多 个断点用于调试较大的程序,即程序中有多个模块、多个通路时用,比较方便,在执行时不论走哪条通路,程序都可 以在断点处停下来,以便调整程序。
断点地址为程序中断处的偏移地址,段地址在 CS 中。
当执行在 DEBUG 状态下汇编的小段程序时,只用 G 命令即可。
( 17 )十六进制运算命令 H
格式: H 数据 1 数据 2
其中数据 1 和数据 2 为十六进制数据。
功能:将两个十六进制数进行相加、减,结果显示在屏幕上。
( 18 )结束 DEBUG 返回到 DOS 命令 Q
格式: Q
功能:程序调试完退出 DEBUG 状态,返回到 DOS 状态下。
Q 命令不能把内存的文件存盘,要想存盘必须在退出 DEBUG 之前用 W 命令写盘
本文来源:https://www.2haoxitong.net/k/doc/bc0e71bfe73a580216fc700abb68a98271feac03.html
文档为doc格式