程序运行中有很多变化的结果,需要在可读和可写的主存开辟存储空间,这就是变量(Variable)。
变量的定义是给变量申请固定长度的存储空间,然后进行相应的存储单元初始化。
变量定义伪指令是最常使用的汇编语言说明性语句,它的汇编语言格式为:
变量名 变量定义伪指令 初值表
变量名表示初值表首个数据的逻辑地址,汇编语言使用这个符号表示地址,当变量名不存在的情况下,汇编程序将直接为初值表分配空间,无符号地址。
初值表是用逗号分隔的参数,由各种形式的常量和特殊的符号“?”、“DUP”组成。
其中“?”表示未赋初值,如果多个存储单元的初值相同,可以用复制操作符DUP说明。
重复次数 dup(重复参数)
变量定义伪指令有DB、DW、DD、DF、DQ和DT。
汇编语言还支持复杂的数据变量,例如结构(Structure)、记录(Record)、联合(Union)等。
用DB定义的变量是字节(BYTE)类型的,占8位,对应无符号整数0 ~ 255(C & C++的char类型)。
.model small .stack .data ; 数据段 minint = 10 bvar1 db 0,128,255,-128,0,+127 bvar2 db 1,-1,38,-38,38h,-38h bvar3 db ? ;无初始值,一般用0填充存储空间 bvar4 db 5 dup('$') bvar5 db minint dup(0),minint dup(minint,?) db 2 dup(2,3,2 dup(4)) .code ;代码段 .startup .exit end
通过DUP操作符为BVAR4定义了5个相同的数据,DUP操作符可以嵌套,像最后一个无变量名的变量初值依次是:02 03 04 04 02 03 04 04。
db 2 dup(2,3,2 dup(4))
用DW定义的变量是16位、字量(Word-sized)数据(对应C、C++语言的short类型)。
8086逻辑地址的段地址和偏移地址都是16位的,可以用16位变量保存。
.model small .stack .data ; 数据段 minint = 10 wvar1 dw 0,32768,65535,-32768,0+32767 wvar2 dw 1,-1,38,-38,38h,-38h wvar3 dw ? wvar4 dw 2010h,1020h dw 5 dup(minint,?) wvar6 dw 3139h,3832h bvar6 db 39h,31h,32h,38h db '$' .code .startup;代码段 mov dx,offset wvar6 ;从wvar6开始显示 mov ah,09h int 21h .exit end
低字节存放在低地址存储单元、高字节存放在高地址存储单元称为小端模式。(80x86系列处理器)
低字节存放在高地址、高字节存放在低地址称为大端模式。
小端模式:低位在前,高位在后。
wvar6是字量数据,占16位,相当于两个字节量数据就是3139H和3832H。
bvar6是字节量数据,占8位,相当于一个字节量数据就是39H,31H,32H,38H。
用DD定义的变量是32位、双字量(Doubleword-Sized)数据(对应C、C++语言的long类型),占用4个连续的字节空间,采用小端方式存放。
.model small .stack .data miint = 10 dvar1 dd 0,80000000h, 0ffffffffh, -80000000h, 0, 7fffffffh dvar2 dd 1, -1, 38, -38, -38h dvar3 dd ? dd 2010h, 1020h dvar5 dd miint dup(miint, ?) dvar6 dd 38323139h bvar6 dd 39h, 31h, 32h, 38h db '$' .code .startup mov dx,offset dvar6 ;指定字符串在数据段的偏移地址 mov ah,9 ;AH赋值9 int 21h ;利用功能调用显示信息 .exit end
8086 处理器采用“低对低、高对高”的小端方式,如果从偏移地址 0090H 开始连续 4个存储单元的内容依次是39H、31H、32H、38H。
变量定义的存储空间是按照书写的先后顺序一个接一个分配的。而定位伪指令可以控制其存放的偏移地址。
ORG伪指令
ORG伪指令将参数表达的偏移地址作为当前偏移地址,格式是:
org 参数
ALIGN伪指令
以字节为存储单位的主存储器来说,多字节数据不仅存在按小端或大端方式存放问题,还存在是否对齐地址边界问题。
对N个字节的数据(N=2,4,8,16,……),如果起始于能够被N整除的存储器地址位置(也称为模N地址)存放,则对齐地址边界。
为了获得更好的性能,常要进行地址边界对齐。ALIGN伪指令便是用于此目的,其格式如下:
align n
N是对齐的地址边界值,取2的乘方(2,4,8,16,…)。
;数据段 org 100h bvar1 db 100 align 2 wvar2 dw 100 even dvar3 dd ?
变量定义除分配存储空间和赋初值外,还可以创建变量名。这个变量名一经定义便具有两类属性:
(1)地址属性——指首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址。
(2)类型属性——指变量定义的数据单位,有字节量、字量、双字量、3 字量、4 字量和10字节量,依次用类型名BYTE、WORD、DWORD、FWORD、QWORD和TBYTE表示。
在汇编语言程序设计中,经常会用到变量名的属性,汇编程序提供有关的操作符,以方便获取这些属性值: