首页 理论教育 语句的格式

语句的格式

时间:2022-02-28 理论教育 版权反馈
【摘要】:对于指令,汇编程序将其翻译为机器语言指令;对于伪指令,汇编程序将根据其所要求的功能进行处理,它并不被翻译成机器语言;对于宏指令,则根据其定义将其展开成一系列指令。则汇编程序将OPER1的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中。所以这条指令与指令如果是变量,则汇编程序将回送该变量的以字节数表示的类型:DB为1,DW为2,DD为4,DQ为8,DT为10。汇编程序应回送分配给该变量的字节数。

3.1.2 语句的格式

从第2章知道,汇编语言源程序中的每个语句可以由四项组成,格式如下:

[名字项:] 操作项 [操作数项] [;注释项]

名字项是一个符号。

操作项是一个操作码的助记符,它可以是指令助记符、伪指令助记符或宏指令助记符。

操作数项由一个或多个表达式组成,它提供操作项所要求的数据。注释项用来说明程序或语句的功能。“;”为识别注释项的开始。“;”也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。

上面四项中带方括号的项是可有可无的。各项之间必须用“空格”(Sp ace)或“横表”(TAB)符隔开。下面分别说明各项的表示方法。

1.名字项

源程序中用下列字符来表示名字:字母A~Z,数字0~9,专用字符?,@,-,$。除数字外,所有字符都可以放在源语句的第一个位置。可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。

一般来说,名字项可以是标号或变量。它们都用来表示本条语句的符号地址,它是可有可无的,只有当需要用符号地址来表示该语句时,它才需要定义。

(1)标号

标号在代码段中定义,后面跟冒号“:”,它也可以用LABEL或EQU伪操作来定义。此外它还可以作为过程名定义,这将在以后的章节中加以说明。标号经常在转移类指令或CALL指令的操作数字段中出现,用以表示转向地址。

标号有三种属性:段、偏移及类型。段属性:定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中偏移属性:标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。类型属性:用来指出该标号是在本段内引用还是在其他段中引用。若在段内引用,则称为NEAR类,指针长度为2字节;若在段外引用,则称为FAR类,指针长度为4字节。(2)变量

变量在除代码段以外的其他段中定义,后面不跟冒号。它也可以用LABLE或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。

段属性:定义变量的段起始地址,此值必须在一个段寄存器中。偏移属性:变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。类型属性:变量的类型属性定义该变量所保留的字节数。如BY TE(1个字节长)、WORD(2个字节长)、DWORD(4个字节长)、QWORD(8个字节长)、TBY TE(10个字节长)。

在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。

2.操作项

操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令;对于伪指令,汇编程序将根据其所要求的功能进行处理,它并不被翻译成机器语言;对于宏指令,则根据其定义将其展开成一系列指令。

3.操作数项

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

操作数项可以是常数、寄存器、标号、变量、表达式。在这里,我们将专门对表达式加以说明,因为常数等元素可以看成是表达式的特例。表达式是常数、寄存器、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址。为了能了解表达式的组成,可以先了解一些用于构成表达式的常用操作符。

(1)算术操作符。

算术操作符有+、-、*、/和MOD。其中MOD是指除法运算后得到的余数,如19/7的商是2,而19MOD 7则为5(余数)。

算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如,两个地址相乘或相除是无意义的。在地址表达式中,可以使用+或-,但也必须注意其物理意义。例如,把两个不同段的地址相加也是无意义的。经常使用格式:地址±数字量,它是有意义的。例如SUM+1是指SUM字节单元的下一个字节单元的地址(注意:不是指SUM单元的内容加1),而SUM-l则是指SUM字节单元的前一个字节单元的地址。

【例3-1】 如要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用指令如下:

MOV DX,BLOCK+(6-1)*2

【例3-2】 如数组ARRAY定义如下,试写出把数组长度(字数)存入CX寄存器的指令。

ARRAY DW 1,2,3,4,5,6,7

ND DW?

其中ND是为计算数组长度而建立的符号地址,所需指令如下:

MOV CX,(ND-ARRAY)/2汇编程序在汇编期间将计算表达式而形成指令。

MOV CX,7

(2)逻辑操作符。

它有AND、OR、XOR和NOT。逻辑操作符是按位操作的,它只能用于数字表达式中。

【例3-3】

IN AL,PORT_VAL

OUT PORT_VALAND 0FEH,AL

其中PORT_V AL为端口号,OUT指令中的表达式说明当PORT_V AL为偶数时,输出端口号与输入端口号相同,而当PORT_V AL为奇数时,则输出端口号比输入端口号小1。

【例3-4】

AND DX,PORT_VALAND 0FEH

该指令在汇编时由汇编程序对指令中的表达式进行计算得到一个端口号,而在程序运行时,该指令的执行是把DX寄存器的内容与汇编程序计算得到的端口号相“与”,结果保存在DX寄存器中。

(3)关系操作符。

它有EQ(相等)、NE(不等)、LT(小于)、G T(大于)、LE(小于或等于)、G E(大于或等于)6种。关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址。计算的结果应为逻辑值:结果为真,表示为0FFFFH;结果为假,则表示为0。

【例3-5】

MOV BX,((PORT_VALLT 5)AND 20)OR((PORT_VALG E 5)AND 30)则当PORT_VAL<5时,汇编结果应该是:

MOV BX,20

否则,汇编结果应该是:

MOV BX,30

(4)数值回送操作符。

它有SEG、OFFSET、TY PE、LENG TH、SIZE。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。

①SEG

格式:SEG V ariable或Label汇编程序将回送变量或标号的段地址值。

【例3-6】 如果DATA_SEG是从存储器的05000H地址开始的一个数据段的段名,OPER1是该段中的一个变量名,则

MOV BX,SEG OPER1

将把0500H作为立即数插入指令。实际上由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使BX寄存器的内容成为0500H。

②OFFSET

格式:OFFSET V ariable或Label

汇编程序将回送变量或标号的偏移地址值。

【例3-7】

MOV BX,OFFSET OPER1

则汇编程序将OPER1的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中。所以这条指令与指令

LEA BX,OPER1

是等价的。

③TY PE

格式:TYPE Variable或Label

如果是变量,则汇编程序将回送该变量的以字节数表示的类型:DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。

【例3-8】

ARRAY DW 1,2,3

则对于指令ADD SI,TY PE ARRAY

汇编程序将其形成为:

ADD SI,2

④LENG TH

格式:LENG TH V ariable

对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数。而对于其他情况则回送l。

【例3-9】

FEES DW 100 DUP(?)

对于指令MOV CX,LENG TH FEES

汇编程序将使其形成为:

MOV CX,100

【例3-10】

ARRAY DW 1,2,3

对于指令 MOV CX,LENG TH ARRAY

汇编程序将使其形成为:

MOV CX,1

【例3-11】

TABLE DB ‘ABCD’

对于指令MOV CX,LENG TH TABLE

汇编程序将其形成为:

MOV CX,1

⑤SIZE

格式:SIZE V ariable

汇编程序应回送分配给该变量的字节数。但是,此值是LENG TH值和TY PE值的乘积,所以,对于例3-9的情况:

MOV CX,SIZE FEES

将形成为MOV CX,200

对于例3-10的情况:

MOV CX,SIZE ARRAY

将形成为 MOV CX,2

而对于例3-11的情况:

MOV CX,SIZE TABLE

将形成为MOV CX,1

(5)属性操作符。

它主要有PTR、段操作符、SHORT、TH IS等。

①PTR格式:

ty p e PTR表达式

PTR用来建立一个符号地址,但它本身并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型。格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。

【例3-12】 已有数据定义如下:

TWO_BYTE DW ?

可以用以下语句对这两个字节赋予另一种类型定义:

ONE_BYTE EQUBYTE PTRTWO_BYTE

OTHER_BYTE EQUBYTE PTR(TWO_BYTE+1)

后者也可以写成:

OTHER_BYTE EQUONE_BYTE+1

这里ONE_BYTE和TWO_BYTE两个符号地址具有相同的段地址及偏移地址,但是它们的类型属性不同,前者为1,后者为2。

前面已经说明类型可有BYTE、WORD、DWORD、NEAR和FAR几种,所以PTR也可以用来建立字、双字或段内及段间的指令单元。

此外,有时指令要求使用PTR操作符。例如:

MOV [BX],5

该指令把立即数存入BX寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR操作符来说明属性,应该写明:

MOV BYTE PTR[BX],5

或MOV WORD PTR[BX],5

②段操作符:用来表示一个标号、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数

MOV AX,ES:[BX+SI]

可见它是用“段寄存器:地址表达式”来表示的。此外,也可以用“段名:地址表达式”或“组名:地址表达式”来表示其段属性。

③SHORT用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的±127个字节范围之内。

【例3-13】 JMP SHORT TAG

TAG:

④THIS格式为:

TH IS Attribute或Type

它可以像PTR一样建立一个指定类型(BYTE、WORD或DWORD)或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。

【例3-14】 FIRST_TY PE EQUTH IS BYTE

WORD_TABLE DW 100DUP(?)

此时FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字节类型的,而WORD_TABLE则是字类型的。

【例3-15】 START EQUTH IS FAR

MOV CX,100

这样,MOV指令有一个FAR属性的地址START,这就允许其他段的JMP指令直接跳转到START来。

现在,我们可以计算出表达式的值了。当然,实际上表达式的值是由汇编程序计算的,而程序员应该掌握正确书写表达式的方法,以减少出错的可能性。

4.注释项

注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。但是,对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序易于被读懂,因此编制汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。读者在阅读程序例子时,应注意学习注释的写法,在编制程序时,更应学会写好注释。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈