微型计算机汇编语言设计 第4章汇编语言语法及其程序格式_第1页
微型计算机汇编语言设计 第4章汇编语言语法及其程序格式_第2页
微型计算机汇编语言设计 第4章汇编语言语法及其程序格式_第3页
微型计算机汇编语言设计 第4章汇编语言语法及其程序格式_第4页
微型计算机汇编语言设计 第4章汇编语言语法及其程序格式_第5页
已阅读5页,还剩181页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,东第4章汇编语言语法及其程序格式

第4章汇编语言语法及其程序格式

4.1汇编语言语句格式

4.2伪指令

4.3汇编语言源程序结构

4.4汇编语言程序的上机过程

4.5动态调试程序DEBUG

习题4

<Back

,套第4章汇编语言语法及其程序格式_____________

4.1汇编语言语句格式

4.1.1语句种类

【例4-1】先给出一个完整的汇编语言源程序,该

程序的功能是完成两个字节数据相加。

DATASEGMENT;段定义开始(DATA段)

BUF1DB34H;第1个加数

BUF2DB2AH;第2个加数

第4章汇编语言语法及其程序格式_____________

SUMDB?;准备用来存放和数的单元

DATAENDS;段定义结束(DATA段)

CODESEGMENT;段定义开始(CODE段)

ASSUMECS:CODE,DS:DATA

;规定DATA、CODE分别为数据段和代码段

START:MOVAX,DATA

MOVDS,AX

;给数据段寄存器DS赋值

MOVAL,BUF1;取第1个加数

,东第4章汇编语言语法及其程序格式

ADDAL,BUF2;和第2个加数相加

MOVSUM,AL;存放结果

MOVAH,4CH;赋功能号

INT21H;返回DOS状态

CODEENDS;段定义结束(CODE段)

ENDSTART;整个源程序结束

,东第4章汇编语言语法及其程序格式

从上面这个例子可以看出,汇编语言源程序由若

干个语句组成,语句分为如下两类:

1)指令语句

指令语句即由8086/8088提供的指令形成的语句,

它能够被翻译成机器代码,并完成一定操作功能。

2)伪指令语句

伪指令语句也叫指示性语句,它只是为汇编程序

在翻译汇编语言源程序时提供有关信息,并不翻译成

机器代码。

,东第4章汇编语言语法及其程序格式

程序中的语句

BUF1DB34H

BUF2DB2AH

SUMDB?

就是伪指令语句,其功能是在内存中开辟三个名

字分别为BUF1、BUF2和SUM的字节单元。前两个单

元的初值分别为34H和2AH,SUM仅指定一个字节单

元,不定义确定的初值。

实际上,汇编语言源程序中还可出现宏指令语句。

宏指令语句就是由若干条指令语句形成的语句体。一

条宏指令语句的功能相当于若干条指令语句的功能。

,东第4章汇编语言语法及其程序格式_____________

4.1.2语句格式

指令语句和伪指令语句的格式是类似的,格式如下:

[名字]操作码操作数[;注释]

其中带方括号的项可以省略,注释内容以分号(;)

引导。

1.名字

1)名字的定义规则

名字就是由用户按一定规则定义的标识符,可由

英文字母(A〜Z,a〜z),数字(0〜9)和特殊符号(?、

@、_)等组成。

,东第4章汇编语言语法及其程序格式_____________

名字的定义要满足如下规则:

(1)数字不能作为名字的第一个符号;

(2)单独的问号(?)不能作为名字;

(3)一个名字的最大有效长度为31,超过31的部分

计算机不再识别;

(4)汇编语言中有特定含义的保留字,如操作码、

寄存器名等,不能作为名字使用。

为了便于记忆,名字的定义最好能够见名知义,

如用BUFFER表示缓冲区,SUM表示累加和等。

,东第4章汇编语言语法及其程序格式_____________

2)名字的主要形式

名字有标号和变量两种主要形式。

(1)标号在代码段中定义,后面跟着冒号。标号也

可以用LABEL或EQU伪指令来定义。此外,标号还可

以作为过程名定义,由于过程由伪指令定义,所以过

程名不需冒号说明。标号经常在转移指令或CALL指令

的操作数字段出现,用以表示转向地址。

标号有三种属性:段、偏移和类型属性。

段属性:定义标号的段起始地址,此值必须在一

个段寄存器中,而标号的段则总是在CS寄存器中。

,东第4章汇编语言语法及其程序格式_____________

偏移属性:标号的偏移地址是从段起始地址到定

义标号的位置之间的字节数。对于16位段是16位无符

号数;对于32位段则是32位无符号数。

类型属性:类型属性用来指出该标号是在本段内

引用还是在其他段中引用的。如是在段内引用的,则

称为NEAR。对于16位段,指针长度为2字节;对于32

位段,指针长度为4字节。如在段外引用,则称为FAR。

对于16位段,指针长度为4字节(段地址2字节,偏移地

址2字节);对于32位段,指针长度为6字节(段地址2字

节,偏移地址4字节)。

,东第4章汇编语言语法及其程序格式

(2)变量在数据段、附加数据段或堆栈段中定义,

后面不跟冒号。它也可以用LABEL或EQU伪指令来定

义。变量经常在操作数字段出现。它也有段、偏移和

类型三种属性。

段属性:定义变量的段起始地址,此值必须在一

个段寄存器中。

偏移属性:变量的偏移地址是从段的起始地址到

定义变量的位置之间的字节数。对于16位段,是16位

无符号数;对于32位段,则是32位无符号数。在当前

段内给出变量的偏移值等于当前地址计数器的值,当

前地址计数器的值可以用$来表示。

,东第4章汇编语言语法及其程序格式___________

类型属性:变量的类型属性定义该变量所保留的字节数。

如BYTE(DB,1个字节长)、WORD(DW,2个字节长)、

DWORD(DD,4个字节长)、FWORD(DF,6个字节长)、

QWORD(DQ,8个字节长)和TBYTE(DT,10个字节长)。

在同一个程序中,同样的标号或变量的定义只允

许出现一次,否则汇编程序会指示出错。

,东第4章汇编语言语法及其程序格式

2.操作码

操作码用来指明操作的性质或功能。指令中的助

记符都是操作码。操作码与操作数之间用空格分开,

如MOV、ADD等都是操作码。

3.操作数

指令中的操作数用来指定参与操作的数据。对于

一般指令,可以有1个或2个操作数,也可以没有操作

数;对于伪指令和宏指令,可以有多个操作数。当操

作数多于1个时,操作数之间用逗号分开。操作数可以

是常数和表达式。

,东第4章汇编语言语法及其程序格式

1)常数

(1)数值常数。汇编语言中的数值常数可以是2进

制、8进制、10进制或16进制数,书写时用加后缀(2进

制用B、8进制用O或Q、10进制用D、16进制用H)的方

式标明即可。对于10进制数可以省掉后缀。对于16进

制数,当以A〜F开头时,前面加数字0,以避免和操

作码混淆。

(2)字符串常数是由包含在单引号中的若干个字符

形成的,字符串在计算机中存储的是相应字符的ASCII

码。如、A,的值是41H,'AB,的值是4142H等。

,东第4章汇编语言语法及其程序格式

(3)符号常数就是指常数用符号名来代替。

用COUNTEQU3或COUNT=3定义后COUNT就是

一个符号常数,与数值常数3等价。

2)表达式

由运算对象和运算符组成的合法式子就是表达

式,分为数值表达式和地址表达式两种。数值表达式

的运算结果是一个数,地址表达式的运算结果是一个

存储单元的地址。

4

,东第4章汇编语言语法及其程序格式_____________

(1)算术运算符有:+(加)、一(减)、*(乘)、/(除)和

MOD(取余)。算术运算符可以用于数值表达式和地址

表达式中,用于地址表达式要注意地址表达式的物理

意义。同一段中的两个地址相减(其值为两个地址之间

字节单元的个数),一个地址加上一个整数(其值为另一

个单元的地址),一个地址减去一个整数(其值为另一个

单元的地址)是有意义的;两个地址相加,两个地址相

乘,两个地址相除是没有意义的。

下面的两条指令是正确的:

MOVAL,4*8+5;数值表达式

MOVSLOFFSETBUF+12;地址表达式

,东第4章汇编语言语法及其程序格式_____________

(2)逻辑运算符有:AND(与卜OR(或)、XOR(异或)

和NOT(非)。逻辑运算符只能用于数值表达式中,不能

用于地址表达式中。逻辑运算符和逻辑运算指令是有

区别的:逻辑运算符的功能在汇编阶段完成;逻辑运

算指令的功能在程序执行阶段完成。

在汇编阶段,指令ANDAL,78HAND0FH等价

于指令ANDAL,08Ho

,东第4章汇编语言语法及其程序格式

(3)关系运算符有:EQ(相等)、LT(小于)、LE(小于

等于)、GT(大于)、GE(大于等于)和NE(不等于)。关系

运算符要有两个运算对象。两个运算对象要么都是数

值,要么都是同一个段内的地址。运算结果为真时,

表示为OFFFFH;运算结果为假时,表示为0000H。

指令MOVBX,32EQ45等价于MOVBX,0

指令MOVBX,56GT30等价于MOVBX,

OFFFFH

第4章汇编语言语法及其程序格式_____________

4.注释项

注释是语句的说明部分,用来说明一条指令或一

段程序的功能,由分号(;)开始。适当地加些注释内

容,可以增加程序的可读性,便于阅读、理解和修改

程序。汇编源程序时,注释部分不产生机器代码。

一条语句可以写在多行上,续行符使用

^Back

,东第4章汇编语言语法及其程序格式

4.2伪指令

汇编语言程序的语句除指令以外还可以由伪指令

和宏指令组成。伪指令又称为伪操作,它们不像机器

指令那样是在程序运行期间由计算机来执行的,而是

在汇编程序对源程序汇编期间由汇编程序处理的操

作,它们可以完成如处理器选择、定义程序模式、定

义数据、分配存储区和指示程序结束等功能。伪指令

形式上与一般指令相似,但伪指令只是为汇编程序提

供有关信息,不产生相应的机器代码。

,东第4章汇编语言语法及其程序格式

4.2.1定义符号的伪指令

有时程序中需要多次出现同一个表达式,为方便

起见,可以用赋值伪指令给表达式赋予一个名字。

1.等值伪指令EQU

格式:〈符号名〉EQUv表达式〉

功能:给符号名定义一个值,赋予一个符号名、

表达式或助记符。

4

第4章汇编语言语法及其程序格式_____________

此后,程序中凡需要用到该表达式之处,就可以

用表达式名来代替了。EQU的引入提高了程序的可读

性,也使其更加易于修改。上式中的表达式可以是任

何有效的操作数格式,或任何可以求出常数值的表达

式,也可以是任何有效的助记符。例如:

CONSTANTEQU256

;数256赋以符号名CONSTANT

DATAEQUHEIGHT+12

;HEIGHT为一标号,地址表达式赋以符号名

DATA

,东第4章汇编语言语法及其程序格式_____________

ALPHAEQU7

BETAEQUALPHA-2

;这是一组赋值伪指令,把7-2=5赋以符号名BETA

ADDREQUVAR+BETA

;VAR+5赋以符号名ADDR

BEQU[BP+8]

;变址引用赋以符号名B

P8EQUDS:[BP+8]

;加段前缀的变址引用赋以符号名P8

,东第4章汇编语言语法及其程序格式

在EQU语句的表达式中,如果有变量或标号的表

达式,则在该语句前应该先给出它们的定义。例如,

语句

ABEQUDATA0NE+2

必须放在DATAJDNE的定义之后才行,否则汇编

程序将指示出错。

2.等号伪指令=

=伪指令与EQU相类似,也可以作为赋值操作使

用,它们之间的区别是EQU伪指令中的表达式名不允

许重复定义,而〃伪指令则允许重复定义。

,东第4章汇编语言语法及其程序格式

【例4-2】EMP=6或EMPEQU6都可以使数6赋以

符号名EMP,然而不允许两者同时使用。但是如下语

EMP=7

EMP=EMP+1

在程序中是允许使用的,因为''=〃伪指令允许重

复定义。这种情况下,在第一个语句后的指令中EMP

的值为7,而在第二个语句后的指令中EMP的值为8。

第4章汇编语言语法及其程序格式_____________

3.解除定义伪指令PURGE

格式:PURGEv符号1,符号2,…,符号N>

功能:解除指定符号的定义,解除符号定义后,

可用EQU重新进行定义。

【例4-3】

Y1EQU7;定义Y1的值为7

PURGEY1;解除Y1的定义

Y1EQU36

;重新定义Y1的值为36

,东第4章汇编语言语法及其程序格式

4.2.2定义数据的伪指令

这一类伪指令的格式是:

[变量]助记符操作数,……,操作数[;注释]

功能:为操作数分配存储单元,并用变量与存储

单元建立联系。

格式中变量〃字段是可有可无的,它用符号地

址表示。''变量〃字段的作用与指令语句前的标号相

同,但它的后面不跟冒号。如果语句中有变量,则汇

编程序使其记为第一个字节的偏移地址。

,东第4章汇编语言语法及其程序格式_____________

''注释〃字段用来说明该伪指令的功能,它也是可

有可无的。

'、助记符〃字段说明伪指令是用于定义数据类型的。

常用的有以下几种:

DB:用来定义字节,其后的每个操作数都占有一

个字节(8位)的存储单元。

DW:用来定义字,其后的每个操作数占有一个字

(16位,其低位字节在第一个字节地址中,高位字节在

第二个字节地址中)。

,东第4章汇编语言语法及其程序格式

DD:用来定义双字,其后的每个操作数占有两个

字(32位)。

DF:用来定义6个字节的字,其后的每个操作数占

有48位,可用来存放远地址。这一伪指令只能用于386

及其后继机型中。

4

,东第4章汇编语言语法及其程序格式_____________

DQ:用来定义4字,其后的每个操作数占有4个字

(64位),可用来存放双精度浮点数。

DT:用来定义10个字节,其后的每个操作数占有

10个字节,形成压缩的BCD码形式。

这些伪指令可以把其后跟着的数据存入指定的存

储单元,形成初始化数据,也可以只分配存储空间而

并不存入确定的数值,形成未初始化数据空间。DW和

DD伪指令还可存储地址,DF伪指令则可存储由16位段

地址和32位偏移地址组成的远地址指针。

,东第4章汇编语言语法及其程序格式

【例4-4】操作数为常数或表达式的定义数据伪指

令举例。

DATABYTEDB10,4,10H

DATAWORDDW100,100H,?5

DATADWDD3C,0FFFDH

汇编程序可以在汇编期间在存储器中存入数据,

汇编后的内存分布如图4.1所示。

,东第4章汇编语言语法及其程序格式

DATABYTE

DATAWORD

DATADW

图4.1例4-4的汇编结果

,东第4章汇编语言语法及其程序格式_____________

[例4-5]操作数是字符串的定义数据伪指令举例o

MESSAGEDBHELLO'

存储器存储情况如图4.2(a)所示,而DB和DW

'AB,的存储情况则分别如图4.2(b)和(c)所示。

,东第4章汇编语言语法及其程序格式

41A42B

42B41A

(b)DBAB(c)DWAB

图4.2例4-5的汇编结果

第4章汇编语言语法及其程序格式_____________

【例4-6】操作数?可以保留存储空间,但不存入

数据。如

ABCDB0,?,?,0

DEFDW?,52,?

经汇编后的存储情况如图4.3所示。

操作数字段还可以使用复制操作符(Duplication

Operator)来复制某个(或某些)操作数。其格式为:

4

,东第4章汇编语言语法及其程序格式_____________

REPEATCOUNTDUP(OPERAND,...,

OPERAND)

其中,REPEAT_COUNT可以是一个表达式,它的

值应该是一个正整数,用来指定括号中的操作数的重

复次数。

,东第4章汇编语言语法及其程序格式

【例4-7】使用DUP实现重复定义。

ARRAY1DB2DUP(O,1,2,?)

ARRAY2DB100DUP(?)

汇编后的存储情况如图4.4所示。由图可见,例4-7中的第

一个语句和语句

ARRAY1DB0,1,2,?,0,1,2,?

是等价的。

第4章汇编语言语法及其程序格式

ABC

DEF

52d

图4.3例4-6的汇编结果

第4章汇编语言语法及其程序格式

图4.4例4-7的汇编结果

,东第4章汇编语言语法及其程序格式_____________

【例4-8】DUP操作可以嵌套,例如:

ARRAY3DB100DUP(0,2

DUP(1,2),0,3)

汇编结果如图4.5所示。

可以用DW或DD伪指令把变量或标号的偏移地址

(DW)或由16位段地址和16位偏移地址组成的整个地址

(DD)存入存储器。用DD伪指令存入地址时,第1个字

为偏移地址,第2个字为段地址。

第4章汇编语言语法及其程序格式

图4.5例4-8的汇编结果

,东第4章汇编语言语法及其程序格式

图4.6例4-9的汇编结果

第4章汇编语言语法及其程序格式_____________

【例4-9】用DW或DD把变量或标号的偏移地址

(DW)或由16位段地址和16位偏移地址组成的整个地址

(DD)存入存储器。

PARTABLEDWPARI

DWPAR2

DWPAR3

INDATADDDATA1

DDDATA2

=5^

,东第4章汇编语言语法及其程序格式

汇编程序的存储情况如图4.6所示。其中,偏移地

址或段地址均占用一个字,其低位字节占用第1个字

节,高位字节占用第2个字节。386及其后继机型具有

16位段地址和32位偏移地址构成的48位远地址,这可

用DF伪指令来定义。

,东第4章汇编语言语法及其程序格式

【例4-10】定义48位地址。

.386

DATASEGSEGMENTPARAUSE32'DATA'

PARSETABLEDB2048DUP(O)

TBLPTRDFPARSETABLE

DATASEGENDS

汇编后的存储情况如图4.7所示。

,东第4章汇编语言语法及其程序格式

TBLPTR

图4.7例4-10的汇编结果

第4章汇编语言语法及其程序格式_____________

4.2.3定义程序开始和结束的伪指令

在程序的开始可以用NAME或TITLE作为模块的

名字。NAME的格式是:

NAMEMODULENAME

汇编程序将以给出的MODULE_NAME作为模块

的名字。如果程序中没有使用NAME伪指令,也可使

用TITLE伪指令指定模块名,其格式为

TITLETEXT

,东第4章汇编语言语法及其程序格式

TITLE伪指令的主要作用是指定列表文件的每一

页上打印的标题,在程序中没有使用NAME伪指令

时,汇编程序将用TEXT中的前6个字符作为模块名。

TEXT最多可有60个字符。如果程序中既无NAME又无

TITLE伪指令,则用源文件名作为模块名。所以NAME

及TITLE伪指令并不是不可缺少的,但一般经常使用

TITLE,以便在列表文件中能打印出标题来。

表示源程序结束的伪指令的格式为

END[LABEL]

,东第4章汇编语言语法及其程序格式

其中,标号LABEL指示程序开始执行的起始地址。

如果多个程序模块相连接,则只有主程序要使用标

号,其他子程序模块则只用END而不必指定标号。汇

编程序将在遇END时结束汇编,而程序则将从主模块

的第一个标号处开始执行。

MASM6.0版的汇编程序还增加了定义程序的入口

点和出口点的伪指令。

第4章汇编语言语法及其程序格式_____________

.STARTUP用来定义程序的初始入口点,并且产

生设置DS、SS和SP的代码。如果程序中使用

了.STARTUP,则结束程序的END伪指令中不必再指定

程序的入口点标号。

.EXIT用来产生退出程序并返回操作系统的代码。

其格式为

.EXIT[RETURNVALUE]

其中,RETURN_VALUE为返回给操作系统的值。

常用0作为返回值。

第4章汇编语言语法及其程序格式

【例4-11】定义示例。

TITLEEXMP

.MODELSMALL

.DATA

.CODE

.STARTUP;程序入口点

.EXIT0

END

,东第4章汇编语言语法及其程序格式

4.2.4指令集选择伪指令

由于80x86的所有处理器都支持8086/8088指令系

统,但每一种高档的机型又都增加了一些新的指令,

因此在编写程序时要对所用处理器有一个确定的选择。

也就是说,要告诉汇编程序应该选择哪一种指令系统。

这一组伪指令的功能就是做这件事的。

此类伪指令主要有以下几种:

第4章汇编语言语法及其程序格式_____________

..8086选择8086指令系统

.286选择80286指令系统

.286P选择保护方式下的80286指令系统

.386选择80386指令系统

.386P选择保护方式下的80386指令系统

.486选择80486指令系统

.486P选择保护方式下的80486指令系统

.586选择Pentium指令系统

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

,东第4章汇编语言语法及其程序格式

有关''选择保护方式下的XXXX指令系统〃的含义

是指包括特权指令在内的指令系统。此外,上述伪指

令均支持相应的协处理器指令。

这类伪指令一般放在整个程序的最前面。如不给

出,则汇编程序默认值为.8086指令系统。它们可放在

程序中,如程序中使用了一条80486所增加的指令,则

可以在该指令的上一行加上.486。

第4章汇编语言语法及其程序格式_____________

4.2.5地址计数器与对准伪指令

1.地址计数器

在汇编程序对源程序汇编的过程中,使用地址计

数器(LocationCounter)来保存当前正在汇编的指令的偏

移地址。当开始汇编或在每一段开始时,把地址计数

器初始化为零,以后在汇编过程中,每处理一条指

令,地址计数器就增加一个值,此值为该指令所需要

的字节数。地址计数器的值可用$来表示,汇编语言允

许用户直接用$来引用地址计数器的值,因此指令

JNE$+6

第4章汇编语言语法及其程序格式

ARRAY0074

图4.8例4-12的汇编结果

第4章汇编语言语法及其程序格式_____________

的转向地址是JNE指令的首地址加上6。当$用在指

令中时,它表示该指令的第一个字节的地址。在这

里,$+6必须是另一条指令的首地址。否则,汇编程序

将指示出错信息。当$用在伪指令的参数字段时,则和

它用在指令中的情况不同,它所表示的是地址计数器

的当前值。

,东第4章汇编语言语法及其程序格式_____________

【例4-12】$用法示例。

ARRAYDW1,2,$+4,3,4,$+4

如汇编时ARRAY分配的偏移地址为0074,则汇编

后的存储区将如图4.8所小。

注意:ARRAY数组中的两个$+4得到的结果是不

同的,这是由于$的值是在不断变化的缘故。当在指令

中用到$时,它只代表该指令的首地址,而与$本身所

在的字节无关。

第4章汇编语言语法及其程序格式_____________

2.ORG伪指令

ORG伪指令用来设置当前地址计数器的值,其格式为

ORGCONSTANTEXPRESSION

如常数表达式的值为N,则ORG伪指令可以使下一

个字节的地址成为常数表达式的值N。

4

第4章汇编语言语法及其程序格式

【例4-13】ORG伪指令示例一。

VECTORSSEGMENT

ORG10

VECT1DW47A5H

ORG20

VECT2DW0C596H

VECTORSENDS

第4章汇编语言语法及其程序格式_____________

贝IJVECT1的偏移地址值为OAH,而VECT2的偏移

地址值为14H。

常数表达式也可以表示从当前已定义过的符号开

始的位移量,或表示从当前地址计数器值$开始的位

移量。

,东第4章汇编语言语法及其程序格式

【例4-14】ORG伪指令示例二。

ORG$+8

可以表示跳过8个字节的存储区,亦即建立了一个

8字节的未初始化的数据缓冲区。如程序中需要访问该

缓冲区,则可用LABEL伪指令来定义该缓冲区的如下

变量名:

第4章汇编语言语法及其程序格式

BUFFERLABELBYTE

ORG$+8

当然,其完成的功能和

BUFFERDB8DUP(?)

是一样的。

,东第4章汇编语言语法及其程序格式_____________

3.EVEN伪指令

EVEN伪指令是使下一个变量或指令开始于偶数字

节地址。一个字的地址最好从偶地址开始,所以对于

字类型数组,为保证其从偶地址开始,可以在其前用

EVEN伪指令来达到这一目的。

,东第4章汇编语言语法及其程序格式

【例4-15]

DATASEGSEGMENT

EVEN

;保证地址从偶地址开始

WORDARRAY

DW100DUP(?)

DATASEGENDS

,东第4章汇编语言语法及其程序格式_____________

4.ALIGN伪指令

ALIGN伪指令为保证双字类型数组边界从4的倍数

开始创造了条件,其格式为

ALIGNBOUNDARY

其中,BOUNDARY必须是2的累,例如:

.DATA

ALIGN4

ARRAYDB100DUP(?)

就可保证ARRAY的值为4的倍数。当然,ALIGN

2和EVEN是等价的。

,东第4章汇编语言语法及其程序格式

4.2.6基数控制伪指令

汇编程序默认的数为十进制数,因而除非专门指

定,汇编程序把程序中出现的数均看作十进制数。为

此,当使用其他基数表示的常数时,需要专门给出基

数的标记。

RADIX伪指令可以把默认的基数改变为2〜16范

围内的任何基数。其格式为

.RADIXEXPRESSION

其中,表达式用来表示基数值(用十进制数表示)。

第4章汇编语言语法及其程序格式_____________

【例4-16]

MOVBX,0FFH

MOVBX,178

.RADIX16

MOVBX,OFF

MOVBX,178D是等价的。

在用.RADIX16把基数定为十六进制后,十进制

数后面都应跟字母D。在这种情况下,如果某个十六进

制数的末字符为D,则应在其后跟字母H,以免与十进

制数发生混淆。

r

,东第4章汇编语言语法及其程序格式

4.2.7过程定义伪指令

可把具有独立功能的程序段定义为过程,供其他

程序调用。

过程定义的语法格式为

〈过程名〉PROCNEAR/FAR

RET

〈过程名〉ENDP

^Back

,东第4章汇编语言语法及其程序格式

4.3汇编语言源程序结构

4.3.1完整段定义的程序结构

存储器的物理地址是由段地址和偏移地址组合而

成的,汇编程序在把源程序转换为目标程序时,必须

确定标号和变量(代码段和数据段的符号地址)的偏移地

址,并且需要把有关信息通过目标模块传送给连接程

序,以便连接程序把不同的段和模块连接在一起,形

成一个可执行程序。为此,需要用段定义伪指令,其

格式如下:

,东第4章汇编语言语法及其程序格式

SEGMENTNAMESEGMENT

SEGMENTNAMEENDS

其中,删节号部分,对于数据段、附加段和堆栈

段来说,一般是存储单元的定义和分配等伪指令,对

于代码段则是指令及伪指令。

此外,还必须明确段和段寄存器的关系,这可用

ASSUME伪指令来实现,其格式为

ASSUME〈段寄存器名〉:

段名[,〈段寄存器名〉:段名,…]

ASSUME〈段寄存器名〉:NOTHING

,东第4章汇编语言语法及其程序格式

其中,''段寄存器名〃必须是CS、DS、ES和SS(对

于386及其后继机型还有FS和GS)中的一个,而'、段名〃

则必须是由SEGMENT定义的段中的段名。ASSUME

NOTHING则可取消前面由ASSUME所指定的段寄存器。

,东第4章汇编语言语法及其程序格式

【例4-17】一个较为完整的汇编源程序段定义:

DATESEG1SEGMENT;定义数据段

DATESEG1ENDS

DATASEG2SEGMENT;定义数据附加段

DATASEG2ENDS

CODESEGSEGMENT;定义代码段

ASSUMECS:CODE_SEG,DS:DATA_SEG1,

ES:DATA_SEG2

,东第4章汇编语言语法及其程序格式_____________

TART:;开始执行的入口地址

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

MOVAX,DATASEG1;将数据段地址赋予DS

MOVDS,AX

;设置ES寄存器为当前附加段

MOVAX,DATA_SEG2;将附加数据段地址赋予ES

MOVES,AX

CODESEGENDS;代码段定义结束

ENDSTART;源程序结束

,东第4章汇编语言语法及其程序格式

由于ASSUME伪指令只是指定某个段分配给哪一

个段寄存器,它并不能把段地址装入段寄存器中,要

把段地址装入段寄存器中,在代码段中就必须包含将

段地址装入相应段寄存器中的指令。例如,以上程序

中,分别用两条MOV指令完成这一操作。如果程序中

有堆栈段,也需要把段地址装入SS中。但是,代码段

CS不需要这样做,这一操作是在程序初始化时完成的。

为了对段定义作进一步地控制,SEGMENT伪指

令还可以增加类型及属性的说明,其格式为

,东第4章汇编语言语法及其程序格式

〈段名>SEGMENT[定位类型][组合类型][使用类型]

[类别]

〈段名>ENDS

一般情况下,这些说明可以不用。但是,如果需

要用连接程序把本程序与其他程序模块相连接时,就

需要使用这些说明。

,东第4章汇编语言语法及其程序格式

1)定位类型(ALIGN_TYPE)

定位类型说明段的起始地址应有怎样的边界值。其

取值可以是:

PARA:指定段的起始地址必须从小段边界开始,

即段起始地址最低位必须为0。这样,偏移地址可以从

0开始。

BYTE:该段可以从任何地址开始。这样,起始偏

移地址可能不是0。

WORD:该段必须从字的边界开始,即段起始地

址必须为偶数。

,东第4章汇编语言语法及其程序格式_____________

DWORD:该段必须从双字边界开始,即段起始地

址的最低位必须为4的倍数。

PAGE:该段必须从负的边界开始,即段起始地址

的最低两个十六进制数位必须为0(该地址能被256整除)。

定位类型的默认项是PARA,即若未指定定位类

型,则汇编程序默认为PARA。

,东第4章汇编语言语法及其程序格式

2)组合类型(COMBINETYPE)

组合类型说明程序连接时段的合并方法。其取值

可以是:

PRIVATE:该段为私有段,在连接时将不与其他

模块中的同名段合并。

PUBLIC:该段连接时可以把不同模块中的同名段

相连接而合并为一个段,其连接次序由连接命令指定。

每一分段都从小段的边界开始,因此各模块的原有段

之间可能存在小于16个字节的间隙。

,东第4章汇编语言语法及其程序格式_____________

COMMON:该段在连接时可以把不同模块中的同

名段重叠而形成一个段,由于各同名分段有相同的起

始地址,所以会产生覆盖。COMMON的连接长度是各

分段中的最大长度。重叠部分的内容取决于排列在最

后一段的内容。

ATEXPRESSION使段地址为表达式所计算出来的

16位值,但它不能用来指定代码段。

MEMORY:与PUBLIC同义。

,东第4章汇编语言语法及其程序格式

STACK:把不同模块中的同名段组合成一个堆栈

段。该段的长度为原有各堆栈段长度的总和,原有各

段之间并无PUBLIC所连接段中的间隙,而且栈顶可自

动指向连接后形成的大堆栈段的栈顶。

组合类型的默认项是PRIVATEo

,东第4章汇编语言语法及其程序格式_____________

3)使用类型(USEJTYPE)

使用类型只适用于386及其后继机型,它用来说明

使用16位寻址方式还是32位寻址方式。其取值可以是:

USE16:使用16位寻址方式。

USE32:使用32位寻址方式。

,东第4章汇编语言语法及其程序格式

当使用16位寻址方式时,段长不超过64KB,地址

的形式是16位段地址和16位偏移地址的组合;当使用

32位寻址方式时,段长可达4GB,地址的形式是16位

段地址和32位偏移地址的组合。可以看出,在实模式

下,应该使用USE16。

使用类型的默认项是USE16。

4)类别名(CLASS)

在引号中给出连接时组成段组的类型名。类别说

明并不能把相同类别的段合并起来,但在连接后形成

的装入模块中,可以把它们的位置靠在一起。

,东第4章汇编语言语法及其程序格式_____________

4.3.2简化段定义的程序结构

较新版本的汇编程序(MASM5.0与MASM6.0)除支

持''完整的段定义伪指令〃中所讨论的SEGMENT伪指

令外,还提供了一种新的较简单的段定义方法。这种

方法虽然不能像SEGMENT伪指令那样具有较完整的表

达能力,但它确实比较简单易用,这就是下面要讨论

的''存储模型与简化的段定义伪指令〃。

第4章汇编语言语法及其程序格式

1)MODEL伪指令

MODEL伪指令的格式如下:

.MODELMEMORYMODEL[,MODELOPTIONS]

MODEL伪指令用来表示存储模型

(MEMORY_MODEL),即用来说明在存储器中是如何

安放各个段的。也就是说,它说明代码段在程序中如

何安排,代码的寻址是近还是远,数据段在程序中又

是如何安排的,数据的寻址是近还是远。根据它们的

不同组合,可以建立如下7种存储模型。

第4章汇编语言语法及其程序格式_____________

(1)TINYo所有数据和代码都放在一个段内,其数

据和代码都是近访问。TINY程序可以写成COM文件

的形式,COM程序必须从0100H的存储单元开始。这

种模型一般用于小程序。

(2)SMALLo所有数据放在一个64KB的数据段

内,所有代码放在另一个64KB的代码段内,数据和代

码也都是近访问的。这是一般应用程序最常用的一种

模型。

(3)MEDIUMo代码使用多个段,一般一个模块一

个段,而数据则合并成一个64KB的段组。这样,数据

是近访问的,而代码则可远访问。

4

,东第4章汇编语言语法及其程序格式_____________

(4)COMPACTo所有代码都放在一个64KB的代

码段内,数据则可放在多个段内。代码是近访问的,

而数据则可为远访问的格式。

(5)LARGEo代码和数据都可用多个段,所以数

据和代码都可以远访问。

(6)HUGEo与LARGE模型相同,其差别是允许数

据段的大小超过64KB。

(7)FLATo允许用户用32位偏移量,但DOS下不

允许使用这种模型,只能在OS/2下或其他保护模式的

操作系统下使用。MASM5.0版本不支持这种模型,但

MASM6.0可以支持。

,东第4章汇编语言语法及其程序格式_____________

MODELOPTIONS允许用户指定三种选项:高级

语言接口、操作系统和堆栈距离。

高级语言接口选项是指该汇编语言程序作为某一

种高级语言程序的过程而为该高级语言程序调用时,

应该使用C、BASIC>FORTRAN和PASCAL等来加以

说明。

操作系统选项是要说明程序运行于哪个操作系统

之下,可用OS_DOS或OSJDS2来说明,默认项是

OS_DOSo

,东第4章汇编语言语法及其程序格式

堆栈星巨离选项可用NEARSTACK或FARSTACK来

说明。其中NEARSTACK是指把堆栈段和数据段组合

到一个DGROUP段中,DS和SS均指向DGROUP段;

FARSTACK是指堆栈段和数据段并不合并。当存储模

型为TINY、SMALL>MEDIUM和FLAT时,默认项为

NEARSTACK;当存储模型为COMPACT、LARGE和

HUGE时,默认项为FARSTACK。

例如:

.MODELSMALL,C

.MODELLARGE,PASCAL,

OS_DOS,FARSTACK

,东第4章汇编语言语法及其程序格式_____________

2)简化的段定义伪指令

汇编程序给出的标准段有下列几种:

(1)CODE(代码段)。

(2)INITIALIZEDDATA(初始化数据段)。

(3)UNINITIALIZEDDATA(未初始化数据段)。

(4)FARINITIALIZEDDATA(远初始化数据段)。

(5)FARUNINITIALIZEDDATA(远未初始化数据段)。

(6)CONSTANTS(常数段)。

(7)STACK(堆栈段)。

,东第4章汇编语言语法及其程序格式

可以看出,这种分段方法把数据段分得更细。一

是把常数段和数据段分开;二是把初始化数据段和未

初始化数据段分开(其中初始化数据是指程序中已指定

初始值的数据);三是把近和远的数据段分开。这样做

的结果是便于与高级语言兼容。读者可采取这些标准

段来组织和编写程序,在连接时可把它们组成段组,

以便提高程序的运行效率。实际上,如果是为高级语

言编写了一个汇编语言过程,可以使用以上标准段模

式。如果编写了一个独立的汇编语言程序,就不必非

要这样细分了。一般采用下述的.CODE、.DATA

和.STACK等定义三个标准段就可以了。

,东第4章汇编语言语法及其程序格式

对应以上的标准段,可有如下简化段伪指令:

.CODE[NAME];对于一个代码段的模型,段名为可选

项;

;对于多个代码段的模型,则应为每个代码段指定段名:

.DATA

.DATA?

.FARDATA[NAME]

;可指定段名。如不指定,则将以FAR_DATA命名

.FARDATA?[NAME]

;可指定段名。如不指定,则将以FAR_BSS命名

,东第4章汇编语言语法及其程序格式

.CONST

.STACK[SIZE]

;可指定堆栈段大小。如不指定,则默认值为1KB

当使用简化段伪指令时,必须在这些简化段伪指

令出现之前,即程序的一开始先用.MODEL伪指令定

义存储模型,然后再用简化段伪指令定义段。每一个

新段的开始就是上一段的结束,而不必用ENDS作为段

的结束符。

第4章汇编语言语法及其程序格式_____________

3)与简化段定义有关的预定义符号

汇编程序给出了与简化段定义有关的一组预定义

符号,它们可在程序中出现,并由汇编程序识别使用。

如在完整的段定义情况下,在程序的一开始,就需要

用段名装入数据段寄存器。

【例4-181

MOVAX,DATASEG1

MOVDS,AX

,东第4章汇编语言语法及其程序格式

若用简化段定义,则数据段只用.DATA来定义,

而并未给出段名,此时可用下述形式完成预定义:

MOVAX,@DATA

MOVDS,AX

这里预定义符就给出了数据段的段名。

此外,还有一些预定义符号,它们也可与条件汇编

伪指令相配合,以帮助用户编写一些较为复杂的代码。

,东第4章汇编语言语法及其程序格式_____________

4)用MODEL定义存储模型时的段默认属性

表4-1给出了使用MODEL伪指令时的段默认情况。

其中,模型列给出了可定义的7种模型。伪指令列给出

了对应每一种模型可定义7种段的伪指令。名字列给出

对应各段所用段名,其中可有多个代码的模型

MEDIUM>LARGE和HUGE中的段,可以在.CODE伪

指令中定义段名NAME。此外,可以看到凡未初始化

的数据段给出的段扩展名均为BSS。定位列给出段的

起始地址边界的类型,组合列给出段的组合类型,类

列给出各段所属类,组列则给出各种模型下所建立的

段组。

,东第4章汇编语言语法及其程序格式_____________

5)简化段定义举例

【例4-19]简化段定义示例之一。

.MODELSMALL

.STACK100H;定义堆栈段

.DATA;定义数据段

.CODE;定义代码段

,东第4章汇编语言语法及其程序格式

START:;程序开始

MOVAX,@DATA;数据段地址送入DS

MOVDS,AX

MOVAX,4C00H;返回DOS

INT21H

ENDSTART;程序结束

可见其比完整的段定义简单得多。但由于完整的

段定义可以全面地说明段的各种类型与属性,因此在

很多情况下仍需使用它。

第4章汇编语言语法及其程序格式

【例4-20]简化段定义示例之二。

.MODELSMALL

.STACK100H

.CONST;定义常数

.DATA;定义数据段

.CODE;定义代码段

START:MOVAX,DGROUP

MOVDS,AX

MOVAX,4C00H返回DOS

INT21H

ENDSTART

,东第4章汇编语言语法及其程序格式

【例4-21]简化段定义示例之三。

.MODELSMALL

.FARDATA

.CODE

START:MOVAX,@DATA

MOVDS,AX

MOVAX,@FARDATA

MOVES,AX

,东第4章汇编语言语法及其程序格式

ASSUMEES:@FARDATA

MOVAX,4C00H

INT21H

ENDSTART

程序中.FARDATA(或.FARDATA?)建立的是独

立的段,所以必须为它们建立一个段寄存器(常用

ES),本例就说明了其定义方法。应当注意其中

ASSUME伪指令的使用方法。

,东第4章汇编语言语法及其程序格式_____________

上述程序中出现的MOVAX,4C00H和INT21H一

对语句是DOS功能调用,其作用是让程序运行结束后

返回DOS操作系统,类似功能的调用还可以使用INT

20H中断调用来实现,关于中断调用和功能调用详见第

8章。

第4章汇编语言语法及其程序格式_____________

4.3.3段组定义的程序结构

从''存储模型与简化段定义伪指令〃中可知在各种

存储模型中,汇编程序自动地把各数据段组成一个段

组DGROUP,以便程序在访问各数据段时使用一个数

据段寄存器DS。下面所给出的GROUP伪指令允许用户

自行指定段组,其格式如下:

GRPNAMEGROUPSEGNAME[,SEGNAME...]

其中,GRPNAME为段组名,SEGNAME则为段名。

,东第4章汇编语言语法及其程序格式

【例4-22】段组定义。

DSEG1SEGMENTWORDPUBLIC

'DATA,

DSEG1ENDS

DSEG2SEGMENTWORDPUBLIC

'DATA,

DSEG2ENDS

DATAGROUPGROUPDSEG1,DSEG2

CSEGSEGMENTPARAPUBLIC'CODE'

,东第4章汇编语言语法及其程序格式

ASSUMECS:CSEG,DS:DATAGROUP

START:MOVAX,DATAGROUP

MOVDS,AX

MOVAX,4C00H

INT21H

CSEGENDS

ENDSTART

这样,程序中对定义在不同段中的变量,都可以

用同一个段寄存器进行访问。

^Back

,东第4章汇编语言语法及其程序格式

4.4汇编语言程序的上机过程

首先用编辑程序(可用任一种文本编辑程序,如

EDIT等)产生汇编语言的源程序(类型为

.ASM的源文件),源程序就是用汇编语言的语句

编写的程序,它是不能为机器直接识别的,所以要经

过汇编程序(MASM)进行翻译。汇编程序的作用就是把

源文件转换成二进制代码形式的目标文件(.OBJ文件)。

,东第4章汇编语言语法及其程序格式

在转换的过程中,汇编程序将对源程序进行扫描,如

果源程序中有语法错误,则汇编结束后,汇编程序将

指出源程序中的错误,要求用户再次使用编辑程序来

修改源程序中的错误后继续汇编,直至得到无语法错

误的.OBJ文件,表示汇编通过。

,东第4章汇编语言语法及其程序格式

.OBJ文件虽然已经是二进制文件,但它还不能直

接上机运行,必须经过连接程序LINK把目标文件与库

文件或其他目标文件连接在一起形成可执行文件(.EXE

文件),这个文件可以由DOS装入存储器,并在机器上

运行。最后,可用动态调试程序DEBUG调试该程序,

如该程序运行有错,需重新进行程序的编辑、汇编和

连接等工作。汇编语言程序汇编的建立及汇编过程如

图4.9所示。

,东第4章汇编语言语法及其程序格式

因此,在计算机上运行汇编语言程序的步骤是:

(1)用编辑程序建立.ASM源文件;

⑵用MASM程序把.ASM文件转汇编成.OBJ文件;

⑶用LINK程序把.OBJ文件转连接成.EXE文件;

(4)用DOS命令直接键入文件名就可执行该程序;

⑸用DEBU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论