Skip to content

伪指令和宏指令

8086宏汇编语言有两种类型的语句:

  1. 指令语句:在汇编过程中被翻译成相应的目标代码,经连接后生成可执行的机器指令代码。
  2. 伪指令语句:(指示性语句)在汇编时被解释执行,由汇编程序来处理的一类操作,如数据定义,分配存储器等。
  3. /前面用来多少内存单元的个数,在字符串定义/$表示数据结束符

1、伪指令语句的格式

格式:符号名 定义符 操作数;注释

1、常用伪指令

1、符号定义伪指令(赋值语句)

等值伪指令

格式:符号名 EQU 表达式

功能:将表达式的值赋给符号名。

​ 例: ALFA EQU 100

​ COUNT EQU ALFA

注意:符号名一旦被EQU定义,就不能再赋值,即不能用EQU再为符号名重新赋值。

2、等号伪指令

格式:符号名 = 表达式

功能:将表达式的值赋给符号名。

说明:可以在程序中不同的地方多次使用以重新为符号名赋值。

asm
例:  ALFA = 100

​ MOV AL,ALFA ;AL←100

​ ALFA = ALFA+2 ; ALFA = 102

2、数据定义伪指令

格式:[变量名] DB 表达式 ;定义字节

​ [变量名] DW 表达式 ;定义字

​ [变量名] DD 表达式 ;定义双字

​ [变量名] DQ 表达式 ;定义8个字节

​ [变量名] DT 表达式 ;定义10个字节

表达式——是赋给变量的初始值,可以有一个,也可 以有多个,常见的有以下几种:

数值表达式

实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。若要定义多个相同类型的数据,可用逗号把这些数据隔开,并依次分配在相邻的存储单元。

例:

​ BUF DB 20H,30H

​ BUF1 DW 100

​ DAT DW 1234H,5678H ;字变量DAT的内容为1234H,占用两个字节单元,下一个字单元即DAT+2单元的内容为5678H,仍是低字节存在低地址单元。

ASCII字符串

​ 字符串必须用引号括起来,并且不超过256个字符,它们在内存中按地址递增顺序自左向右依次存放字符的ASCII码。

例:STRING DB ‘ABC’

​ STRING1 DB ‘ How are you? ’

例: DATA DB ‘AB’

​ DATA1 DW ‘AB’

3、?

?——为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。

例: RESULT DB ?;预置一个字节单元,其值不定

​ ABC DB 12H , ?, ? , 24H

​ DEF DW ?,895H ,?

4、重复定义子句 DUP——可以为若干个重复数据分

配存储单元。

格式: n DUP (表达式)

说明: n:重复次数 表达式:重复的内容

例: C DB 100 DUP(0)

​ TAB DB 100 DUP(5 DUP(1),2)

注意:

(1) DUP操作可以嵌套。

(2)在定义变量及存储单元的同时,也定义了它们的类型属性。同一数据定义语句所定义的各存储单元具有相同的类型。

例:

DA1 DB 3 DUP(5,?, 6); 从DA1地址单元开始存放三组“05H,预留,06H”共9个地址单元

DA2 DW 40 DUP(?);从DA2地址单元开始保留40个字共80个地址单元

DA3 DB 10 DUP(1,2,3 DUP(30,4);从DA3地址单元开始存放十组“01,02,30,04,30,04,30,04”,共占用80个字节**。**

3、段定义伪指令

格式:

​ 段名 SEGMENT [定位类型][组合类型][‘类别名’]

​ ┆段体

​ 段名 ENDS

功能:把模块化分为若干个逻辑段。

​ 每个SEGMENT/ENDS可定义一个逻辑段。

4、段寄存器说明伪指令

格式:

ASSUME 段寄存器 :段名[,段寄存器 :段名…]

功能:向汇编程序指示当前各段所用的段寄存器,设

​ 定段寄存器与段的对应关系。

注意:

①本伪指令只是指示各逻辑段使用寄存器的情况,并没有对段寄存器内容进行装填。段寄存器的实际值(CS除外)还要由MOV指令在程序中装填数据。

②也可用来取消段寄存器与段之间的对应关系(用NOTHING),然后再建立新的对应关系。

asm
例:     	ASSUME   DS: NOTHING
           ASSUME   DS: DATAB 	       		    
           MOV      AX, DATAB   装载数据段寄存器	
           MOV      DSAX

5、过程定义伪指令

过程是程序的一部分,它可以被程序调用。每次

可调用一个过程,当过程中的指令执行完后,控制返

回调用它的地方。过程的定义是用过程定义伪指令完成的。

asm
格式: 过程名   PROC  [NEAR / FAR]  

                  ┇    过程体

                RET

       过程名   ENDP

宏指令

1、宏定义及其调用

宏定义格式: 宏指令名 MACRO [形参,形参,┅] ┇  宏体

​ ENDM

宏调用的格式为: 宏指令名 [实参,实参,┅]

例:为了实现ASCII码和BCD码之间的相互转换,往往需要把AL中的内容左移或右移4位。设左移4位,可用下列指令序列实现:

​ MOV CL,4

​ SAL AL,CL

若多次使用,则可用一条宏指令来代替,宏定义如下:

SHIFT MACRO

MOV CL,4

SAL AL,CL

ENDM

例24:

​ ┇

MOV AL,[DI]

ADD AL,[SI]

SHIFT ;宏调用

MOV [BX],AL

​ ┇