1. [< 变量名 >]{db|dw|dd|dq|dt}< 表达式 >,< 表达式 >;
2. 表达式 为数据项分配存储单元的 , 用来留预存单元 . temp db ?
3. 带 dup 的表达式 重复数据定义操作符
dup<( 表达式 )> tab1 db 10h dup 保留 10h 个字节单元
变量定义( define )伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化
变量名 伪指令助记符 初值表
变量定义伪指令最常使用变量名
变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址
变量名可以没有 , 这种情况,汇编程序将直接为初值表分配空间,无符号地址
设置变量名是为了方便存取它指示的存储单元
初值表
初值表是用逗号分隔的参数
主要由数值常数、表达式或?、 dup 组成
?——表示初值不确定,即未赋初值;
dup ——表示重复初值
dup 的格式为:
重复次数 dup( 重复初值参数 )
变量定义伪指令助记符
变量定义伪指令根据申请的主存空间单位分类
db ——定义字节伪指令
dw ——定义字伪指令
dd ——定义双字伪指令
df ——定义 3 字伪指令
dq ——定义 4 字伪指令
dt ——定义 10 字节伪指令
还有定位伪指令
定义字节单元伪指令 db
db 伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值
初值表中每个数据一定是字节量( byte ),存放一个 8 位数据:
可以是 0~255 的无符号数
或是- 128 ~+ 127 带符号数
也可以是字符串常数
data segment ;数据段
x db 'a',-5
db 2 dup(100),?
y db 'abc'
data ends
字节单元定义实例
mov al,x
; 此处 x 表示它的第 1 个数据,
故 al ← 'a'
inc x+1
; 对 x 为始的第 2 个数据减 1 ,
故成为 -4
mov y,al
; 现在 y 这个字符串成为
'abc'
字节变量的应用
定义字单元伪指令 dw
dw 伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值
初值表中每个数据一定是字量( word ),一个字单元可用于存放任何 16 位数据:
一个段地址
一个偏移地址
两个字符
0 ~ 65535 之间的无符号数
- 32768 ~+ 32767 之间的带符号数
data segment ;数据段
count dw 8000h,?,'ab'
maxint equ 64h
number dw maxint
array dw maxint dup(0)
data ends
字单元定义实例
字变量和字常量的定义:
wnum equ 5678h
; 定义 wnum 为常量
count dw 20h
; 定义 count 变量,假设在数据段的偏移地址为 10h
字变量和字常量的应用:
mov ax,[bx+si+wnum] ; mov ax,[bx+si+5678h]
mov ax,count ; mov ax,[0010h]
mov ax,[si+count] ; mov ax,count[si]
; mov ax,[si+10h]
lea bx,count ; lea bx,[0010h]
mov bx,offset count ; mov bx,0010h
字变量和字常量
定义双字单元伪指令 dd
dd 伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值
初值表中每个数据是一个 32 位的双字量( double word ):
可以是有符号或无符号的 32 位整数
也可以用来表达 16 位段地址(高位字)和 16 位的偏移地址(低位字)的远指针
vardd dd 0,?,12345678h
farpoint dd 00400078h
其他数据单元定义伪指令
定义 3 字伪指令 df ——用于为一个或多个 6 字节变量分配空间及初始化
6 字节常用在 32 位 cpu 中表示一个 48 位远指针( 16 位段选择器 :32 位偏移地址)
定义 4 字伪指令 dq ——用于为一个或多个 8 字节变量分配空间及初始化
8 字节变量可以表达一个 64 位整数
定义 10 字节伪指令 dt ——用于为一个或多个 10 字节变量分配空间及初始化
10 字节变量可以表达扩展精度浮点数
例 : 数据定义综合应用
.model small
.stack
.data
bvar db 16
wvar dw 4*3
dvar dd 4294967295 ; = 232 - 1
qvar dq ?
db 1,2,3,4,5
tvar dt 2345 ; 定义了 bcd 码 2345h
abc db 'a','b','c'
msg db 'hello',13,10,'$'
bbuf db 12 dup('month')
dbuf dd 25 dup(?)
calldos equ <int 21h>
.code
.startup
mov bl,bvar
mov ax,word ptr dvar[0]
mov dx,word ptr dvar[2]
; 取双字到 dx.ax
mov dx,offset msg
mov ah,09h
calldos
.exit 0
end
定位伪指令
定位伪指令控制数据的偏移地址
org 参数
org 伪指令是将当前偏移地址指针指向参数表达的偏移地址:
org 100h ; 从 100h 处安排数据或程序
org $+10
; 使偏移地址加 10 ,即跳过 10 个字节空间
masm 中,符号“ $ ”表示当前偏移地址值
even ; 从偶地址开始
align n ; 从 n 的整数倍地址开始