如何编写和汇编语言程序精讲

发布时间:2020-04-15 21:41:26   来源:文档文库   
字号:


如何编编语言程

可以用普通文本编辑辑汇编语言源程序用的有 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》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式