汇编语言伪指令功能总结
1 数据定义语句
格式:符号名 [数据定义语句] 表达式
表达式可以是一下情况之一:
- 一个常数表达式;
- 问号(?),作为非确定的初始值;
- 一个或多个字符的字符串(只限于DB类型);
- 重复字句:重复次数 DUP (表达式)。
- DB(Define Byte)定义字节:1Byte
- DW(Define Word)定义字:2Byte
- DD(Define Double Word)定义双字:4Byte
- DQ(Define Quad Word)定义4个字:8Byte
- DT(Define Ten Bytes)定义10个字节:10Byte
example:
ONE DB 1, 2, 3, 4, 5
TWO DB 'A'
THREE DB 'Welcome !'
FOUR DB ?, ?
FIVE DB 16 DUP (5, 6, 7) ; 16个567
2 符号定义语句
2.1 EQU 赋值语句
格式:符号名 EQU 表达式
给符号定义一个值,或其他符号名,甚至一条可执行指令。相当于#define。
EQU对一个符号名只允许定义一次。
2.2 = 等号语句
格式:符号名 = 表达式
此语句功能与EQU类似,但该语句在一个程序中可以对同一符号名多次重定义。
2.3 LABEL 标号定义语句
格式:标号名 LABEL 属性(NEAR/FAR)
用冒号定义标号(标号名:)只能定义NEAR属性的标号;使用LABEL伪指令定义标号可以定义NEAR或FAR属性的标号。
example:
NEXT: CALL N-STEP ; 定义NEXT为NEAR属性的标号
FIRST LABEL FAR ; 定义FIRST为FAR属性的标号,其地址为该语句的下一条语句的地址
MOV AX, CX
3 过程定义语句
; 格式
[过程名] PROC [过程类型]
...
...
...
[过程名] ENDP
; example
display PROC NEAR
...
...
...
display ENDP
- NEAR类型:调用指令与过程在同一个段中
- FAR类型:调用指令与过程不在同一个段中
4 段定义语句
4.1 SEGMENT/ENDS
; 格式
段名 SEGMENT [定位类型][组合类型]['类别']
...
...
...
段名 ENDS
[定位类型]:表示该段的起始地址的要求,可以是PAGE
、PARA
、WORD
、BYTE
之一。
PAGE:段起始地址后8位为0
PARA:段起始地址后4位为0 (默认值)
WORD:段起始地址后1位为0
BYTE:段起始地址为任意
[组合类型]:用来告诉连接程序本段与其他短的关系,可以是NONE
、PUBLIC
、COMMON
、AT 表达式
、STACK
、MEMORY
之一。
- NONE:表示本段与其他段逻辑上不发生关系,每段都有自己的基地址。此项为默认值。
- PUBLIC:连接程序首先把本段与同名同类别的其他段相邻地连接在一起,然后为所有这些PUBLIC端指定一个共同的段基址,也就是连成一个物理段。
- COMMON:连接程序为本段和同名同类别的其他段指派相同的基地址。因而将本段与同名同类别的其他段产生覆盖。段的长度取决于最长的COMMON段的长度。
- AT 表达式:连接程序把本段装在表达式的值所指定的段地址上。这个类型与ORG伪指令配合使用,可以在某一固定的存储器内的某一固定的偏移地址处定义标号或变量,以使程序以标号或变量形式访问蛇蝎确定的地址。
- STACK:与PUBLIC同样处理,但此段作为堆栈段,被连接程序中必须至少有一个STACK段。如果有多个,则在初始化时使SS指向所遇到的第一个STACK段。
- MEMORY:连接程序将把本段定位在被连接在一起的其他所有段之上。若有多个MEMORY段,汇编程序认为所遇到的第一个为MEMORY,其余为COMMON。
[‘类别’]:可以是任何合法的名称,必须用单引号括起来。连接程序把类型名相同的段放在连续的存储区内。典型类别如:’STACK’、’DATA’、’CODE’。
4.2 ASSUME 段寻址语句
格式:ASSUME 寄存器名:段名[, …]
example:
ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA
4.3 ORG 定义偏移地址语句
格式:ORG 表达式
ORG语句指定了在它以后的程序或数据块存放的起始地址的偏移量。
当遇到一个新的ORG语句,则从新的地址开始存放。省略ORG,则从偏移量0开始存放。
4.4 $ 地址计数器
DATA SEGMENT
; $ = 0
W1 DW 0B3H
; $ = 2
C4 EQU $ - W1 ; C4 = 2 - 0 = 2
; $ = 2
B1 DB 'ABC'
; $ = 5
C0 EQU $ - B1 ; C0 = 5 - 2 = 3
; $ = 5
W2 DW -4, 1234H, 0F4ADH, 923FH ; 8Byte
; $ = 13
C1 EQU ($ - W2)/2 ; C1 = (13 - 5)/2 = 4
; $ = 13
C2 EQU ($ - W2) ; C2 = 13 - 5 = 8
; $ = 13
ORG 100
; $ = 100
buf DB 100 DUP (?)
; $ = 200
DATA ENDS
4.5 GROUP 分组语句
格式:组名 GROUP 段名[, 段名, …]
将若干段说明为使用同一物理段,以组名表示其段基址。
4.6 结束语句
格式:END [表达式]
该语句表示整个源程序的结束,它告诉汇编程序汇编任务到此结束。
表达式必须是源程序的起始地址或入口地址。
5 运算符
5.1 算术运算符
$+、-、*、/、MOD(\%)$
5.2 逻辑运算符
$AND、OR、NOT、XOR$
5.3 关系运算符
$EQ、NE、GT、GE、LT、LE$
等于、不等于、大于、大于等于、小于、小于等于
5.4 分析运算符
5.4.1 TYPE
格式:TYPE 变量/标号
返回变量以字节数表示的类型:
BD——1;DW——2;DD——4;DQ——8;DT——10。
返回标号类型数值:
NEAR——0FFFFH(-1);FAR——0FFFEH(-2)。
5.4.2 LENGTH
格式:LENGTH 变量
对于变量中使用DUP,汇编返回分配给变量的单元数,其他情况返回1。
example:
FESS DD 100 DUP (1)
MOV CX, LENGTH FESS
; 汇编后的结果为
MOV CX, 100
5.4.3 SIZE
格式:SIZE 变量
返回分配给该变量的字节数
SIZE = LENGTH * TYPE
example:
FESS DD 100 DUP (1)
MOV CX, SIZE FESS
; 汇编后的结果为
MOV CX, 400 ; 100 * 4
5.4.4 OFFSET
格式:OFFSET 变量/标号
取出变量或标号所在段的偏移地址
5.4.5 SEG
格式:SEG 变量/标号
取出变量或标号所在段的段基址
5.5 合成运算符
5.5.1 PTR
格式:类型/距离 PTR 变量/标号
给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型的匹配。
类型/距离:BYTE、WORD、DWORD、NEAR、FAR
example:
F1 DB 16H, 38H
F2 DW 1234H, 5566H
MOV AX, WORD PTR F1 ; 使F1类型转换成字与AX类型匹配,AX=3816H
MOV BL, BYTE PTR F2 ; 使F2类型转换成字节与BL匹配,BL=34H
可以通过PTR指明是存入字节单元还是字单元
example:
MOV BYTE PTR [BX], 10H ; [BX] = 10H
MOV WORD PTR [BX], 10H ; [BX + 1] = 00H [BX] = 10H
5.5.2 THIS
格式:变量/标号 EQU THIS 类型/距离
THIS的功能是将EQU THIS右边的类型/距离属性赋给左边的变量/标号。该变量/标号的段地址和偏移地址与下一个存储单元的地址相同。
FIRST EQU THIS BYTE
TABLE DW 200 DUP (?)
FIRST的偏移地址与TABLE的偏移地址相同,区别在于FIRST变量为字节类型,TABLE为字类型。
SOP EQU THIS FAR
MOV AX, 100
在MOV AX, 100前定义了标号SOP,并赋予FAR属性,允许其他段的JMP指令跳到本段SOP标号地址上。
5.5.3 HIGH/LOW 字节分离操作符
格式:HIGH/LOW 表达式
对一个数或地址表达式,HIGH从中分离出高位字节,LOW分离出低位字节;表达式的值必须为常量;不能在存储器操作数的内容上使用,因为在运行时其内容是可以变化的。
example:
STUF EQU 0ABCDH
MOV AH, HIGH STUF ; AH = 0ABH
MOV AL, LOW STUF ; AL = 0CDH
5.5.4 SHORT
格式:SHORT 标号
用来说明转移类指令中转向地址的属性,指出转向的目的地址与本指令之间的距离在 $-128 \sim +127$ ,即限制在短转移范围内。