汇编语言从入门到精通-4标识符和表达式
標識符和表達式
標識符和表達式是程序設計經常用到的兩個基本概念。在用高級語言進行程序設計時,如果程序要對某個變化的量進行處理時,通常都要對該變化量定義一個具有某種數據類型的符號名,用該符號名也就等于使用了該變化量。在匯編語言中,也是如此,所不同的是它們的說明和引用方式不同。
?
4.1 標識符
在匯編語言中,標號、內存變量名、子程序名和宏名等都是標識符,它一般最多由31個字母、數字及規定的特殊字符(?、@、_、$)等組成,并且不能用數字開頭。通常情況下,匯編語言不區分標識符中字母的大小寫。
和高級語言的變量名一樣,一般要求標識符盡可能取得有點含義,這會大大改善程序的可讀性,并有助于對程序的理解。但標識符不能是匯編語言的保留字,匯編語言的保留字主要是指:指令助憶符、偽指令定義符、寄存器名以及一些具有特殊含義的字符串等。
例如:MSG1、ERRMSG2、ASC1、asc2等是合法的標識符,而1a、ah、mov等就不是合法的標識符。
試比較ABCDH和0ABCDH之間的差異。前者是標識符,而后者是十六位進制數值。
?
4.2 簡單內存變量的定義
在編程序時,我們往往要根據程序的需要定義一些內存單元。在高級語言程序中,要給存儲單元取一個符號名,然后通過引用該符號名來訪問其所對應的存儲單元,而在匯編語言程序中要靈活一些,它可以給存儲單元取符號名,也可以不取符號名。當給存儲單元取符號名時,則可通過該符號名來訪問其對應的存儲單元;當不給存儲單元取符號名時,則可通過存儲單元的偏移量(有效地址)來訪問它。
匯編語言中,常見的數據類型有字節、字和雙字等。下面介紹如何定義各種整型類型的內存變量,有關浮點類型變量的定義方式將在第11章中介紹
4.2.1 內存變量定義的一般形式
定義數據變量語句是在程序中經常使用的偽指令語句,其一般格式如下:
[變量名] 數據定義符 表達式1[, 表達式2, …, 表達式n] ;注釋
該定義格式的主要解釋如下:
1、變量名必須是一個合法的標識符,它可以寫,也可以不寫;
2、 數據定義符用于確定內存單元的數據類型,常用的定義符有:DB、DW和DD等;
3、 表達式是定義內存單元時的初值表達式,一個定義語句可以有多個初值表達式,各表達式之間必須用逗號‘,’分開;如果某個存儲單元沒有初值表達式,則必須用一個問號‘?’來表示;
4、 在定義語句的后面可以書寫注釋內容,也可以不寫。
在定義變量時,雖然可以不寫變量名,但我們建議還是要寫,因為不寫變量名,就意味著只能用內存單元的偏移量來訪問它。這時,一旦內存單元的偏移量發生變化,那么,程序中的所有引用都要修改,這不僅增加了程序維護的工作量,而且也容易因遺漏修改而出錯。
4.2.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的十六進制編碼。
圖4.1 內存單元的分配情況示意圖
注意:在上例中,說明語句“DB 'A', 'D', 0Dh, '$'”之前并沒有給出變量名,但我們可以從前面的變量名COUNTER一直往后數,或從TABLE往前數,來訪問某存儲單元,因為它們是一片連續的存儲單元,這和高級語言的變量定義有點區別的。在高級語言中,我們一定要用某個標識符來說明變量,也必須用該變量名來訪問其所對應的存儲單元。
用定義符DB還可定義一種特殊的數據形式——字符串。在定義字符串時,必須用成對的單引號或雙引號把所要的字符括起來,括號內字符的ASCII碼將依次存放在相應的字節單元內。例如:
MSG1 DB 'I am a student.'
該說明語句所對應的存儲單元分布如下所示。為了看起來方便,并沒有用字符的ASCII碼來存放在相應的存儲單元內,而直接用該字符,請不要引起誤解。
| … | 'I' | ' ' | 'a' | 'm' | ' ' | 'a' | ' ' | 's' | 't' | 'u' | 'd' | 'e' | 'n' | 't' | … |
上面的例子也可改寫為另一種等價的語句:
MSG1 DB 'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.'
顯然,前者的說明要比后者方便得多,所以,在程序中都采用前者的書寫方式。
4.2.3 字變量
定義字變量的定義符為DW/WORD(Define Word),每個字占用兩個連續的字節單元。
例如:
Word1 DW 89H, 1909H, -1
DW 0abcdH, ?, 0
上述定義的內存分配如下所示。
| … | 89 | 00 | 09 | 19 | FF | FF | CD | AB | -- | -- | 00 | 00 | … |
由于字變量的數據是按照“高高低低”的原則存于存儲單元之中的,而字節數據是按照排列順序存于存儲單元中的,所以,它們的存儲方式有所不同。
試比較下面兩個定義的存儲順序,其中:41H和42H分別是'A'和'B'的ASCII碼。
B1 DB 'AB'
W1 DW 'AB'
| … | 41h | 42h | 42h | 41h | … |
4.2.4 雙字變量
定義雙字變量的定義符為DD/DWORD(Define Doubleword),每個雙字變量占用二個連續的字單元(四個字節)。
DW1 DD 12345678H, ?
DW2 DD 0abcd1243H
上述定義的內存分配如下所示。
| … | 78 | 56 | 34 | 12 | -- | -- | -- | -- | 43 | 12 | CD | AB | … |
?
4.2.5 六字節變量
定義六字節變量的定義符為DF/FWORD(Define Farword)。顧名思義,每個六字節變量占用六個連續的字節。
DF1 DF 1234567890abH, -1
DF 1abcd23H
上述定義的內存分配如下所示。
| … | abH | 90H | 78H | 56H | 34H | 12H | 0FFH | 0FFH | 0FFH | 0FFH | 0FFH | 0FFH | 23hH | 0cdH | 0abH | 01H | 00H | 00H | … |
(占6個字節)
?
4.2.6 八字節變量
定義八字節變量的定義符為DQ/QWORD(Define Quadword)。同理,每個八字節變量占用八個連續的字節。
DQ1 DQ 12345678H, 0H, -1234H
DQ ?, 1238H, ?
第一個八字節常量12345678H在內存中的分配方式如下所示,其存儲原則與前面相同。其它八字節常量的存儲方式與此一致。
| … | 78 | 56 | 34 | 12 | 00 | 00 | 00 | 00 | … |
(占8個字節)
?
4.2.7 十字節變量
定義十字節變量的定義符為DT/TBYTE(Define Tenbytes)。同理,每個十字節變量占用十個連續的字節。
DT1 DT 12345678H, 0H, -1234H
DT2 DT ?, -1H
第一個十字節常量12345678H在內存中的分配方式如下所示,它同樣按“高高低低”的原則來存儲。其它十字節常量的存儲方式與此一致。
| … | 78 | 56 | 34 | 12 | 00 | 00 | 00 | 00 | 00 | 00 | … |
以上六個數據類型是匯編語言中最基本的數據類型,其中,前三個是在程序中經常使用的,后三個的使用頻率不太高。
?
轉載于:https://www.cnblogs.com/little-kwy/p/9744292.html
總結
以上是生活随笔為你收集整理的汇编语言从入门到精通-4标识符和表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用自定义的标签
- 下一篇: [CF1036C]Classy Numb