第四章伪指令 下载本文

图4-4 DQ定义数据示意图

5. DT伪指令

DT伪指令定义五个字的存储单元(10个字节)。采用DT伪指令一般用于存储10个字节长的BCD码。

语句格式如下:<变量名> DT [数据1,数据2,数据3,…..数据n] 功能:定义5字数据。

说明:该伪指令定义了10个字节,一般用于存放十进制BCD码。 例如:

VAR1 DT 97H

定义了一个变量VAR1,该变量定义了数据97H,该数据占据了10个字节。其存储形式如图4-5所示。

图4-5 DT定义数据示意图

小结:在使用DW、DD、DQ和DT定义字符串数据时,最多只能定义2个字符,否则汇编过程会出错。如VAR1 DW “ABC”该伪指令语句是错误的。所以用户需要定义多个(大于2个字符)字符数据时,需要使用DB伪指令进行定义。

4.3.2 复制操作符DUP

在以上5种数据定义伪指令中的数据项中,还可以使用复制操作符复制操作数。 语句格式:<表达式> DUP (数据1,数据2,数据3,?,数据n)

功能:重复定义DUP后面给出的数据列表,重复次数由表达式的值决定。 说明:复制操作符可以重复复制数据表中给出的数据,但是从整体上看它还是属于数据定义伪指令语句中一个单独的数据项。表达式的值应该是一个正整数,用于指定括号中的数据项重复次数。DUP可以进行嵌套,即数据项中还可以出现符合规定的复制操作符DUP。

例如:

VAR1 DB 2AH, 3 DUP (“A”)

VAR2 DB 12H, 2 DUP (1AH,2BH,3 DUP (4CH)),5DH

从变量VAR1开始,定义了2A这个字节数据,然后再定义了3个字符数据A(41H)。这些数据占据了4个字节。然后再定义变量VAR2后面的字节数据12H,接着连续定义2次1AH、2BH和3个4CH数据,最后定义了5这个数据。其存储形式如图4-6所示。

图4-6 DUP重复定义数据示意图

4.3.3变量的类型属性问题

这里,我们必须再进一步说明变量类型属性问题。 变量的类型属性(TYPE)是指变量所代表的数据占用存储单元(以字节为单位)的多少。所以数据定义伪指令DB所定义变量的类型属性为1字节,DW为2字节,DD为4字节,DQ为8字节,而DT为10字节。

我们可以使用PTR属性操作符临时改变变量的类型属性,它优先于隐含的类型属性。 语句格式:<类型> PTR <变量>

说明:类型可以是BYTE或WORD,这样就可以改变相应变量的类型属性了。

例4-4 设VAR1为字变量,内容为1234H,请编写一个程序将VAR1的高字节送入DL寄存器,低字节送入CL寄存器。

解:因为VAR1是字变量,所以在没有进行转换类型之前只能对该变量进行字操作。但是我们可以使用PTR属性操作符暂时性改变VAR1的类型属性,使其能够进行字节操作。

程序代码编写如下: DSEG SEGMENT VAR1 DW 1234H DSEG ENDS CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG START:

MOV AX,DSEG MOV DS,AX

MOV DL,BYTE PTR VAR1+1 ;VAR1变量高字节单元内容送DL寄存器 MOV CL,BYTE PTR VAR1 ;VAR1变量低字节单元内容送CL寄存器 MOV AH,4CH

INT 21H ;返回DOS CSEG ENDS END START

该程序的MOV DL,BYTE PTR VAR1+1和MOV CL,BYTE PTR VAR1指令将VAR1暂时性改变为字节变量,将VAR1的高字节的内容送入DL寄存器中,而低字节内容送入了CL寄存器。当这两条指令执行完毕后,变量VAR1仍然为字变量。

程序经保存、汇编、连接和DEBUG后,使用U命令查看反汇编后,再输入G 000F命令执行程序。结果如图4-7所示。

图4-7 调试结果

由图4-7可知, VAR1+1代表了0001H偏移量,VAR1代表了0000H偏移量。

4.4符号定义伪指令

4.4.1 符号定义伪指令(EQU)

在设计汇编语言程序时,有时多次出现同一个数值或表达式。为方便起见,可通过符号定义伪指令给它赋予一个符号名,以后就可以用这个符号名代替这个数值或表达式。

语句格式:符号名 EQU 表达式 功能:用符号名代表该表达式的值。

说明:EQU伪指令可以将符号名等价于一个常量或一个能求出常数值的表达式。还可以在EQU语句中引用一个已经定义的符号名,甚至可以定义为一条可执行的命令。但是EQU伪指令不允许对同一个符号名重复定义。

例4-5 请分析以下程序,掌握EQU的用法。 CSEG SEGMENT ASSUME CS:CSEG START:

ACC EQU AX ;符号ACC等价于AX寄存器 MOV ACC,DSEG ;等价于MOV AX,DSEG MOV DS,ACC ;等价于MOV DS,AX MOV AH,4CH

INT 21H ;返回DOS CSEG ENDS