匯編語言--標識符和表達式(四)(簡單內存變量的定義)


四、標識符和表達式

1、標識符

在匯編語言中,標號、內存變量名、子程序名和宏名等都是標識符,它一般最多由31個字母、數字及規定的特殊字符(?、@、_、$)等組成,並且不能用數字開頭。通常情況下,匯編語言不區分標識符中字母的大小寫。標識符不能是匯編語言的保留字,匯編語言的保留字主要是指:指令助憶符、偽指令定義符、寄存器名以及一些具有特殊含義的字符串等。

例如:MSG1、ERRMSG2、ASC1、asc2等是合法的標識符,而1a、ah、mov等就不是合法的標識符。試比較ABCDH和0ABCDH之間的差異。前者是標識符,而后者是十六位進制數值。

2、簡單內存變量的定義

在編程序時,我們往往要根據程序的需要定義一些內存單元。在高級語言程序中,要給存儲單元取一個符號名,然后通過引用該符號名來訪問其所對應的存儲單元,而在匯編語言程序中要靈活一些,它可以給存儲單元取符號名,也可以不取符號名。當給存儲單元取符號名時,則可通過該符號名來訪問其對應的存儲單元;當不給存儲單元取符號名時,則可通過存儲單元的偏移量(有效地址)來訪問它。

(1)內存變量定義的一般形式

定義數據變量語句是在程序中經常使用的偽指令語句,其一般格式如下:

[變量名]  數據定義符  表達式1[, 表達式2, …, 表達式n] ;注釋

該定義格式的主要解釋如下:

1) 變量名必須是一個合法的標識符,它可以寫,也可以不寫;

2) 數據定義符用於確定內存單元的數據類型,常用的定義符有:DB、DW和DD等;

3) 表達式是定義內存單元時的初值表達式,一個定義語句可以有多個初值表達式,各表達式之間必須用逗號‘,’分開;如果某個存儲單元沒有初值表達式,則必須用一個問號‘?’來表示;

4) 在定義語句的后面可以書寫注釋內容,也可以不寫。

在定義變量時,雖然可以不寫變量名,但我們建議還是要寫,因為不寫變量名,就意味着只能用內存單元的偏移量來訪問它。這時,一旦內存單元的偏移量發生變化,那么,程序中的所有引用都要修改,這不僅增加了程序維護的工作量,而且也容易因遺漏修改而出錯。

(2)字節變量

定義字節變量的定義符為DB/BYTE(Define Byte),每個字節只占一個字節單元。其中:BYTE是MASM 6.0及其以后版本的數據類型說明符,隨后的其它類型說明符同此說明。

例如:

COUNTER DB 6

DB 'A', 'D', 0Dh, '$'

TABLE DB 1, 3, 5, 7, 9, 11

上面的定義語句經匯編后所產生出的內存單元分配情況如圖4.1所示。圖中的數據是用十六進制表示的(以后也如此,不再說明),由引號括起來的字符在內存中是存放其ASCII碼值。所以,'D'和0Dh是不同的,前者是字符'D',后者是數值12的十六進制編碼。

clip_image002

注意:在上例中,說明語句“DB 'A', 'D', 0Dh, '$'”之前並沒有給出變量名,但我們可以從前面的變量名COUNTER一直往后數,或從TABLE往前數,來訪問某存儲單元,因為它們是一片連續的存儲單元,這和高級語言的變量定義有點區別的。在高級語言中,我們一定要用某個標識符來說明變量,也必須用該變量名來訪問其所對應的存儲單元。

用定義符DB還可定義一種特殊的數據形式——字符串。在定義字符串時,必須用成對的單引號或雙引號把所要的字符括起來,括號內字符的ASCII碼將依次存放在相應的字節單元內。例如:

MSG1 DB 'I am a student.'

該說明語句所對應的存儲單元分布如下所示。為了看起來方便,並沒有用字符的ASCII碼來存放在相應的存儲單元內,而直接用該字符,請不要引起誤解。(字符串內存分配和上圖一樣會轉化成ASCII值)

clip_image004

上面的例子也可改寫為另一種等價的語句:

MSG1 DB 'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.'

顯然,前者的說明要比后者方便得多,所以,在程序中都采用前者的書寫方式。

(3)字變量

定義字變量的定義符為DW/WORD(Define Word),每個字占用兩個連續的字節單元。

例如:

Word1 DW 89H, 1909H, -1

DW 0abcdH, ?, 0

上述定義的內存分配如下所示。

clip_image006

由於字變量的數據是按照“高高低低”的原則存於存儲單元之中的,而字節數據是按照排列順序存於存儲單元中的,所以,它們的存儲方式有所不同。

試比較下面兩個定義的存儲順序,其中:41H和42H分別是'A'和'B'的ASCII碼。

B1 DB 'AB' (字節變量連續存儲)

W1 DW 'AB' (字變量占兩個字節,按高高低低存儲)

clip_image008

(4)雙字變量

定義雙字變量的定義符為DD/DWORD(Define Doubleword),每個雙字變量占用二個連續的字單元(四個字節)(按高高低低原則存儲,注意內存地址是由小到大)。

DW1 DD 12345678H, ?

DW2 DD 0abcd1243H

上述定義的內存分配如下所示。

clip_image010

(5)六字節變量

定義六字節變量的定義符為DF/FWORD(Define Farword)。顧名思義,每個六字節變量占用六個連續的字節。(不夠高位用0補足)

DF1 DF 1234567890abH, -1

DF 1abcd23H

上述定義的內存分配如下所示。

clip_image012

(6)八字節變量

定義八字節變量的定義符為DQ/QWORD(Define Quadword)。同理,每個八字節變量占用八個連續的字節。

DQ1 DQ 12345678H, 0H, -1234H

DQ ?, 1238H, ?

第一個八字節常量12345678H在內存中的分配方式如下所示,其存儲原則與前面相同。其它八字節常量的存儲方式與此一致。

clip_image014

(7)十字節變量

定義十字節變量的定義符為DT/TBYTE(Define Tenbytes)。同理,每個十字節變量占用十個連續的字節。

DT1 DT 12345678H, 0H, -1234H

DT2 DT ?, -1H

第一個十字節常量12345678H在內存中的分配方式如下所示,它同樣按“高高低低”的原則來存儲。其它十字節常量的存儲方式與此一致。

clip_image016

以上六個數據類型是匯編語言中最基本的數據類型,其中,前三個是在程序中經常使用的,后三個的使用頻率不太高。


免責聲明!

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



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