汇编语言程序格式

更新时间:2024-03-13 15:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言程序格式

【思考】

(1) 建立并运行一个汇编语言程序有几个操作步骤? (2) 指令和伪指令的区别是什么?

(3) 在汇编语言程序中,段定义伪指令和数据定义伪指令起什么作用? (4) 变量和标号的类型属性分别有哪几种?

(5) 什么是表达式?表达式的优先级顺序是如何排列的? (6) 汇编语言的上机过程是什么?

(7) 汇编语言源程序一般由几个段组成?

(8) 汇编程序和连接程序的输入、输出文件有哪些?它们的作用是什么? 【学习目标】

了解编辑程序、汇编程序、连接程序的功能及其输入、输出文件的类型; 了解汇编语言源程序的格式;

熟练掌握并运用段定义伪指令和数据定义及存储器分配伪指令;

熟悉数值表达式的书写规范;上机编程时学会使用DEBUG调试程序。 【学习指南】

介绍了汇编语言程序的完整段和简化段格式。在学习本内容时,可利用汇编语言程序的框架,通过上机来验证和理解各种指令和伪指令的格式、功能及作用。 【难重点】

段定义伪指令、数据定义及存储器分配伪指令及其它伪指令; 数据类型属性和代码属性及其在编程中的应用; 数值表达式的表示及其应用。 【知识点】

1 汇编程序功能 2 伪指令

2.1 段定义伪指令

2.1.1 完整的段定义伪指令

2.2.2 存储模型与简化段定义伪指令 2.2.3 段组定义伪指令

2.3 程序开始和结束伪指令

2.4 数据定义及存储器分配伪指令 2.5 表达式赋值伪指令

2.6 地址计数器与对准伪指令 2.7 基数控制伪指令 3 汇编语言程序格式

3.1.汇编语言源程序语句的格式 3.2 表达式

3.3 汇编语言源程序格式举例

4 汇编语言程序的上机过程 1 建立汇编语言的工作环境 2 汇编语言程序上机运行过程 3 COM文件

第 1 页 共 21 页

第一节 汇编程序功能 建立, 运行汇编语言程序

汇编程序的主要功能:

1. 检查源程序,给出出错信息。

2. 产生目标文件(.obj)和列表文件(.lst)。 3. 展开宏指令。

第二节 伪指令

汇编语言程序中的语句可以由指令、伪指令和宏指令组成。上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。

伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。

宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。宏指令将在第七章中介绍。

伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。和各种指令一样,伪指令也是程序设计不可缺少的工具。下面介绍一些常用的伪指令。

第 2 页 共 21 页

2.1 处理器选择伪操作

.8086 选择 8086 指令系统 .286 选择 80286 指令系统

.286P 选择保护模式下的 80286 指令系统 .386 选择 80386 指令系统

.386P 选择保护模式下的 80386 指令系统 .486 选择 80486 指令系统

.486P 选择保护模式下的 80486 指令系统 .586 选择 Pentium 指令系统

.586P 选择保护模式下的 Pentium 指令系统

2.2 段定义伪指令

段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。

1.完整段定义伪指令的格式如下:

由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中: MOV AX,DATA_SEG1 ; 数据段地址 MOV DS,AX ; 存入DS寄存器 MOV AX,DATA_SEG2 ; 附加段地址 MOV ES,AX ; 存入ES寄存器

如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中: MOV AX,STACK_SEG ; 堆栈段地址 MOV SS,AX ; 存入ES寄存器

第 3 页 共 21 页

注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。而DS和ES是指向一个称为“PSP”(程序段前缀)的一块区域的首地址。

为了对段定义作进一步地控制,SEGMENT伪指令还可以增加类型及属性的说明,其格式如下:

段名 SEGMENT [定位类型][组合类型]['类别'] … 段名 ENDS

[ ]中的内容是可选的,一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要提供类型和属性的说明。

第 4 页 共 21 页

·定位类型:说明段的起始边界值(物理地址)。

定位类型 BYTE WORD DWORD PARA PAGE 说 明 段可以从任何地址边界开始 段从字边界开始,即段的起始边界值为偶数 段从双字的边界开始,即段的起始边界值为4的倍数 段从小段边界开始,即段的起始边界值为16 (或10H) 的倍数 段从页边界开始,即段的起始边界值为256 (或100H) 的倍数 注意: 定位类型的缺省项是PARA,即在未指定定位类型的情况下,则连接程序默认为PARA。BYTE和WORD用于把其它段(通常是数据段)连入一个段时使用;DWORD一般用于运行在80386及后继机型上的程序。

·组合类型:说明程序连接时的段组合方法。 组合类型 PRIVATE PUBLIC COMMON AT 表达式 MEMORY STACK 说 明 该段为私有段,连接时将不与其它模块中的同名段合并 该段连接时将与其它同名段连接在一起,连接次序由连接命令指定 该段在连接时与其它同名段有相同的起始地址,所以会产生覆盖 段地址=表达式的值,其值必为16位但AT不能用来指定代码段 与PUBLIC同义 将多个同名堆栈段连接在一起,SP设置在第一个堆栈段的开始 注意:组合类型的缺省项是PRIVATE。

例: 在连接之前已定义两个目标模块如下:

模块1 SSEG SEGMENT PARA STACK

DSEG1 SEGMENT PARA PUBLIC 'Data' DSEG2 SEGMENT PARA

CSEG SEGMENT PARA 'Code'

模块2 DSEG1 SEGMENT PARA PUBLIC 'Data' DSEG2 SEGMENT PARA

CSEG SEGMENT PARA 'Code'

以上两个模块分别汇编后产生 .OBJ 文件,经连接程序连接后产生的 .EXE模块如下:

模块1 CSEG SEGMENT PARA 'Code' 模块2 CSEG SEGMENT PARA 'Code'

模块1+2 DSEG1 SEGMENT PARA PUBLIC 'Data'

第 5 页 共 21 页

DUP(duplicate)

DUP伪指令可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6个FFH存入相继字节中,可以用下面两种方法,显然用DUP的方法更简便些。

存入6字节的FFH

DATA20 DB 0FFH 0FFH 0FFH 0FFH 0FFH 0FFH; DATA21 DB 6 DUP(0FFH)

PTR属性操作符

PTR指定操作数的类型属性,它优先于隐含的类型属性。其格式为:

类型 PTR 变量[ ± 常数表达式]

其中类型可以是BYTE、WORD、DWORD、FWORD、QWORD或TBYTE,这样变量的类型就可以指定了。如下例:(P131 例14)

LABEL伪指令

LABEL可以使同一个变量具有不同的类型属性。其格式为:

其中变量的数据类型可以是BYTE,WORD,DWORD。

第 11 页 共 21 页

2.5 表达式赋值伪操作EQU

EQU是一个赋值伪操作(伪指令),它给一个数据标号赋于一个常数值,但这个常数不占用存储单元。当这个数据标号出现在程序中时,汇编程序即用它的常数值代替数据标号。EQU可以在数据段之外使用,甚至可用在代码段中间。

使用EQU操作的优点可从下面的例子中看出: COUNT EQU 25

COUNTER DB COUNT MOV AL, COUNT

= 伪操作

赋值伪操作\的作用与EQU类似。它们之间的区别是,EQU伪操作中的标号名是不允许重复定义的,而=伪操作是允许重复定义的。

注意:在EQU语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。如上例,ALPHA必须在BETA之前定义,否则汇编程序将指示出错。 例如, TMP EQU 5

TMP EQU TMP+1 则是错误语句,因为TMP已赋值为5,就不能再把它定义为其它数值。

而 TMP = 5

TMP = TMP+1 则是允许使用的,因为=伪操作允许重复定义。第一个语句TMP的值为5,第二个语句TMP的值就为6了。

2.6 地址计数器与对准伪指令 1.

第 12 页 共 21 页

ORG 伪操作:

生成COM程序:

2.EVEN伪指令

EVEN伪指令使下一个变量或指令开始于偶数字节地址。

3. ALIGN伪指令

ALIGN伪指令使它后面的数据或指令从2的整数倍地址开始。其格式为: ALIGN 2n (n为任意整数)

2.7 基数控制伪指令 .RADIX伪指令

.RADIX可以把默认的基数改变为2~16范围内的任何基数。其格式如下:

.RADIX 基数值

其中基数值用十进制数来表示。

应当注意,在用 .RADIX 16把基数定为十六进制后,十进制数后面都应跟字母D。在这种情况下,如果某个十

六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。

第 13 页 共 21 页

4.3 汇编语言程序格式

3.1.汇编语言源程序语句的格式

(1) 名字项

源程序中用下列字符来表示名字: 字母A~Z 数字0~9

专用字符 ?、·、@ 、-、$

除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到·则必须是第一个字符。可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。 一般说来,名字项可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。 · 标号:标号在代码段中定义,后面跟着冒号:,它也可以用LABEL或EQU伪操作来定义。此外,它还可以作为过程名定义,这将在以后的章节中加以说明。 · 变量:变量在数据段或附加数据段中定义,后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经常在操作数字段出现。 (2)操作项

操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。宏指令在第七章中将会专门论述。 (3) 操作数项

操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个,或二个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。

操作数项可以是常数、寄存器、标号、变量或由表达式组成。 (4) 注释项

注释项用来说明一段程序、一条或几条指令的功能。对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序容易被读懂,因此汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。

第 14 页 共 21 页

3.2 表达式

(1) 算术操作符

算术操作符有+、-、*、/ 和MOD。

MOD是指除法运算后得到的余数,如19/7的商是2,而19 MOD 7则为5(余数)。

(2) 逻辑操作符 AND、OR、XOR、NOT、 SHL、SHR

(3) 关系操作符

关系操作符有:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。

第 15 页 共 21 页

(4) 数值回送操作符

TYPE、LENGTH、SIZE、OFFSET、SEG

例:

(5) 属性操作符

属性操作符主要有:PTR、段操作符、SHORT、THIS、HIGH、LOW等。

第 16 页 共 21 页

· 操作符的优先级(p143)

操作符的优先级别从高到低排列如下: 1. 在圆括号中的项,方括号中的项,结构变量(变量,字段。),然后是LENGTH、SIZE、WIDTH和MASK。 2. 名:(段取代)。

3. PTR,OFFSET,SEG,TYPE,THIS及段操作符。 HIGH和LOW。

5. 乘法和除法:*,/,MOD。 6. 加法和减法:+,-。

7. 关系操作:EQ,NE,LT,LE,GT,GE。 8. 逻辑:NOT。 9. 逻辑:AND。

10. 逻辑:OR,XOR。 11. SHORT。

3.3 汇编语言源程序格式举例(p144) 例1.完整段定义格式

; TITLE 文件名- 程序主要功能描述 ;EQU 语句

;* * * * * * * * * * * * * * * * * * * * * * * * * * datarea segment ;定义数据段 ;数据定义语句

datarea ends

;* * * * * * * * * * * * * * * * * * * * * * * * * * prognam segment ;定义代码段

;--------------------------------------------------- main proc far ;主程序 assume cs:prognam,ds :datarea

start: ;程序起始执行地址

;为程序返回DOS设置堆栈值 push ds ;入栈保存原DS段址 sub ax,ax ;设置偏移地址为0 push ax ;入栈保存偏移地址

;置DS寄存器为当前数据段

mov ax,datarea ;datarea段地址 mov ds,ax ; 存入DS寄存器

;主程序部分

ret ;返回 DOS main endp ;主程序结束

第 17 页 共 21 页

;---------------------------------------------------- sub1 proc near ;定义子程序

;子程序部分

sub1 endp ;子程序结束

;------------------------------------------------------------------------------

prognam ends ;代码段结束

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * end start ;汇编结束

例2.简化段定义格式

.model small ;定义存储器模型 .stack 100h ;定义堆栈段 .data ;定义数据段

; 数据定义语句

.code ;定义代码段 main proc far start:

mov ax,@data ;数据段地址

mov ds,ax ; 存入DS寄存器

;主程序部分

mov ax,4c00h

int 21h ;返回DOS main endp ;主程序结束 end start ;汇编结束

4 汇编语言程序的上机过程 1 建立汇编语言的工作环境

为运行汇编语言程序至少要在磁盘上建立以下文件: 1. 编辑程序,如EDIT.EXE 2. 汇编程序,如MASM.EXE 3. 连接程序,如LINK.EXE 调试程序,如DEBUG.COM

必要时,还可建立如CREF.EXE,EXE2BIN.EXE等文件。

第 18 页 共 21 页

2 汇编语言程序上机运行过程

C>EDIT MYFILE.ASM

C>MASM MYFILE.ASM

Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Corp 1981-1985,1987.All rights reserved. Object filename [MYFILE.OBJ]: Source listing [NUL.LST]: MYFILE.LST Cross-reference [NUL.CRF]:

51646 + 44778 Bytes symbol space free 0 Warning Errors 0 Severe Errors

C>LINK MYFILE.OBJ

Microsoft (R) Overlay Linker Version 3.60Copyright (C) Microsoft Corp 1983-1987. All rights reserved. Run File [MYFILE.EXE]: List File [NUL.MAP]: Libraries [.LIB]:

LINK : warning L4021: no stack segment

C>MYFILE

上述内容是建立并运行一个汇编语言程序的操作,红色字表示程序员键入的命令,黑色字是计算机的回答,为回车符。假设EDIT、MASM、LINK和汇编语言程序都在C盘中。

LINK程序的输出文件有.EXE可执行文件和.MAP连接映象文件。.EXE文件是CPU能识别并执行的代码,.MAP连接映象文件给出了每个段在存储器中的分配情况。左面是 MYFILE.MAP文件,它给出了各个段的起始地址、结束地址及其大小。

3 COM文件

COM文件也是一种可执行文件,由程序本身的二进制代码组成,它没有EXE文件所具有的包括有关文件信息的标题区(header),所以它占有的存储空间比EXE文件要小。COM文件不允许分段,它所占有的空间不允许超过64K,因而只能用来编制较小的程序。由于它小而简单,装入速度比EXE文件要快。

使用COM文件时,程序不分段,其入口点(开始运行的起始点)必须是100H,在此之前的256个字节是程序段前缀。COM文件不必设置堆栈段。在程序装入时,由系统自动把SP建立在该段之末。对于所有的过程则应定义为NEAR。

用户在建立源文件以后,经过汇编、连接形成EXE文件,然后可以通过EXE2BIN程

第 19 页 共 21 页

序来建立COM文件,操作命令如下: C>exe2bin filename filename.com

COM文件还可以直接在调试程序DEBUG中用A或E命令建立,对于一些短小的程序,这也是一种相当方便的方法。

【本章小结】

1. 程序结构伪指令:包括段定义伪指令、段组定义伪指令、程序开始和结束伪指令等。

NAME、TITLE、END、SEGMENT、ENDS、ASSUME、GROUP

2. 数据类型及数据定义伪指令:包括数据定义及存储器分配伪指令、表达式赋值伪指令、基数控制伪指令等。

DB、DW、DD、DQ、DT、DUP、PTR、LABEL

3. 地址计数器与对准伪指令 $、ORG、EVEN、ALIGN

4. 汇编语言程序格式: 完整段定义格式 简化段定义格式

5.汇编语言程序上机过程: C>EDIT FILENAME.ASM ↙ C>MASM FILENAME.ASM ↙ C>LINK FILENAME.OBJ ↙ C>FILENAME ↙

6 汇编程序和连接程序的输入输出文件。

第 20 页 共 21 页

本文来源:https://www.bwwdw.com/article/iml8.html

Top