變量
程序運行中有很多變化的結果,需要在可讀和可寫的主存開辟存儲空間,這就是變量(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表示。
在匯編語言程序設計中,經常會用到變量名的屬性,匯編程序提供有關的操作符,以方便獲取這些屬性值: