08、匯編語言--變量


變量

程序運行中有很多變化的結果,需要在可讀和可寫的主存開辟存儲空間,這就是變量(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表示。

在匯編語言程序設計中,經常會用到變量名的屬性,匯編程序提供有關的操作符,以方便獲取這些屬性值:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM