第三节 8086汇编伪指令与操作数运算符
一、8086汇编伪指令
1.简化段定义伪指令
(1)存储模式伪指令
格式:
.MODEL 存储模式 [,语言类型(通常缺省)][,堆栈类型]
;堆栈类型可以是NEARSTACK
(如果SS == DS
)或FARSTACK
(如果SS != DS
),默认值为NEARSTACK
。
各种存储模式及属性:
例(存储模式定义语句),采用SMALL模式,近堆栈类型:
.MODEL SMALL
.MODEL large,c,farstack
(2)数据段定义伪指令
数据段定义格式
.DATA
;生成的数据段的段名为_DATA
,程序员可以通过@DATA的方法获得数据段的段基址。
例 :
MOV AX,@DATA
MOV DS,AX
(3)代码段定义伪指令
代码段定义格式:
.CODE[名字]
(4)堆栈段定义伪指令
堆栈段定义格式:
.STACK [大小]
【如果没有指定堆栈大小,则默认大小为1KB
,默认段为STACK
】
例:定义一个
4KB
的堆栈段
.STACK 4096
【只有主模块(有起始标号)才能定义堆栈段】
2.数据定义伪指令
目的:为一个数据项分配存储单元。
格式:
[变量名] 命名 操作数项[,操作数项...] [;注释]
主要命令:
·DB
———— 定义字节数据,MASM6.11后可以用BYTE
,占1字节
·DW
———— 定义字,MASM6.11后可以用WORD
,占一个字,2字节
·DD
———— 定义双字,MASM6.11后可以用DWORD
,占一个双字,4字节
·DF
———— 定义6字节
·DQ
———— 定义8字节
·DT
———— 定义10字节
【操作数项包括:常量或表达式、字符串(定义字符串只能用
BYTE
或DB
)、?表达式、带DUP
的表达式】;DUP
:复制操作符,可以复制某个或某些操作数。
····例:定义变量(※※※※※)····
NLIST DW 100 11B,'B',-1
;为变量NLIST
分配3字节初值为03H
,42H
,0FFH
DB 'PAS',?
;为变量NLIST
再分配4字节,NLIST
共占7字节
NLS DW 1,2,'AB'
;为变量NLS
分配3字节,初值为0001H
,0002H
,4241H
····例:复制操作符
UDP
复制某个(或某些操作数)(※※※※※)····
BUFFER DW 100 DUP(?)
;为BUFFER
分配100字节
SW DB 3 DUP('A5',2),1
;为变量SW
分配10字节 ———— [(2+1)*3]+1 = 10
ARRAY DB 2 DUP('abc',3 UDP(?))
;为变量ARRAY
分配12字节 ———— (3+3)*2=12
····例1:假设
DS = 1000H
,给出下列数据在内存中的分配····
.DATA
DATA1 DB 31H
DATA2 DB'abc'
DATA3 DW 3864H
.CODE
例1 图解:
····例2:假设
DS = 2000H
,给出下列数据在内存中的分配····
.DATA
DATA1 DB2 DUP(54H,2 DUP(7))
DATA2 DW'ab'
.CODE
例2 图解:
3.地址定位伪指令与地址计数器
(1)地址定位伪指令 ORG
格式:ORG 表达式
目的:将表达式的值送入程序计数器
例:假设
DS = 1000H
,给出下列数据在内存中的分配?
DATA
DATA1 DB 31H
DATA2 DB 'abc'
ORG 6
DATA3 DB86H,5FH
.CODE
图解:
(2)地址计数器 $
$ 表示它当前所在位置的偏移地址。
例:
DS = 1000H
,给出下列数据在内存中的分配?
.DATA
ORG 126H
ARRAY DW 1, 2, $ + 5, 3, $ + 2
.CODE
图解:
(3)定位偶地址起始伪指令
格式:EVEN
例:
ORG 100H
BUF1 DB 12
EVEN
;保证BUF2从偶数地址开始
BUF2 DW 8F76H
(4)地址边界对齐伪指令
格式:ALIGN NUM
例:
ORG 100H
BUF1 DB 12
ALIGN 4
;保证BUF2是从奇数地址开始
BUF2 DD 8F76H
4.符号定义伪指令
(1)用 EQU 伪指令定义符号
格式:符号名 EQU 表达式
例:
CONST EQU 100*2
;定义符号常量
ADDRS EQU [BX + 10]
;为地址表达式定义名字
COUNT = AX
;给寄存器定义名字
(2)用 = 定义符号
格式:符号名 = 表达式
例:
NUM = 23
5.过程定义伪指令
格式:
过程名 PROC [NEAR/FAR]
过程体
过程名 ENDP
6.程序起始伪指令
格式:
.STARTUP
7.程序退出伪指令
格式:
.EXIT [返回码]
【通常情况下返回码为0
】,此时该伪指令会产生的代码:
MOV AX,4C00H
INT 21H
8.程序结束伪指令
格式:
END [起始标号]
二、宏指令
目的:简化程序的书写而设计的。
格式:
宏名 MACRO [形参1,形参2,...]
宏体
ENDM
;宏定义结束
说明:
MACRO
和ENDM
是成对出现的。
调用宏的格式:
宏名 [实参1,实参2,...]
例:
ADDUP MACRO AD1,AD2,AD3
;定义一个带3个形参的宏
MOV AX , AD1
ADD AX, AD2
ADD AX, AD3
ENDM
...
ADDUP BX, 2, COUNT
;宏调用
三、操作数运算符
1.算数运算符
例1:
将首地址为BLOCK
字数组的第6个字传送到DX
解:
MOV DX, BLOCK + (6 - 1) * 2
;地址 + 常量,结果仍为一地址
例2:
设数据定义如下:
ARRAY DW 1, 2, 3, 4, 5, 6, 7
WENDA DW ?
将数组长度(字数)存入CX
:
解:
MOV CX,(WENDA - ARRAY)/2
;地址 - 地址 = 常量。(/2是因为ARRAY
是一个DW
型数组,每个数据项占2字节)
2.逻辑与移位运算符
3.关系运算符
4.数值回送运算符
【注:原文中的OFFSET运算符后的示例注释可能有问题,待定?原文图如下】
5.属性运算符
BE%8B9.png&pos_id=img-82gg75Tw-1698039855336)
PTR
运算符格式:
类型 PTR 表达式
例:
JMP FAR PTR NEXT
;指明NEXT
是一个远地址指针,实现段间转移