數值表達式
數值表達式
數值表達式是指評估為數字的任意表達式。該表達式可以是變數、常量、函數和運算符的任意組合。主要包括常量、算術運算符、關係運算符、邏輯運算符等。
常量是一個立即數,直接寫在彙編語言語句中,在程序的執行過程中,它不可能發生變化。通常,我們用二進位、八進位、十進位或十六進位來書寫常量。
例如:10101011B、324Q、1234D、1234H、0abcdH、'AB'等都是常量。
在程序中,我們還可用偽指令.RADIX來改變數據的基數,在後面再詳細講解。
算術運算符包括符號:+(正)、-(負),運算符:+(加)、-(減)、*(乘)、/(除)和MOD(取模)。這些運算符和常量、括弧可組成數值表達式。
如:,,,等
關係運算符包括符號:EQ(相等)、NE(不等)、LT(小於)、GT(大於)、LE(小於等於)和GE(大於等於)。這些關係運算符和常量、括弧也可組成數值表達式。該表達式的計算結果規定如下:
若關係不成立,則該數值表達式的計算結果為0;否則,其結果為0FFFFH。
如:,21H LE 21H等,它們的計算結果分別為:0和0FFFFH。
邏輯運算符包括按位操作符和移位操作符。具體是:AND(邏輯與)、OR(邏輯或)、NOT(邏輯非)、XOR(異或)、SHL(左移位)和SHR(右移位)。這些邏輯運算符和常量、括弧可組成數值表達式。
如:1 SHL 3,47H AND 0FH,NOT 56H等,它們的計算結果分別為:8,7和0A9H。
彙編語言中,還有其它可在數值表達式中使用的操作符。它們是:
、HIGH(高8位)、LOW(低8位)
、SEG(段地址)、OFFSET(偏移量)
、TYPE(標識符類型)、LENGTH(變數長度)、SIZE(變數容量)
、WIDTH(記錄/記錄欄位寬度)、MASK(記錄/記錄欄位的屏蔽位)等
在以上操作符中,只有HIGH和LOW沒有介紹過,它們分別是選取表達式計算結果的高8位和低8位。其使用格式如下:
HIGH 表達式 LOW 表達式
如:,LOW 1234H等,它們的選取結果分別為:13H和34H。
在彙編語言中,有許多各種運算符和操作符,它們的優先順序按從高到低的排列如下:
優先順序:高
LENGTH、SIZE、WIDTH、MASK、()、[]、.(用於結構欄位)、<>(用於記錄類型)
PTR、SEG、OFFSET、TYPE、THIS、:(用於段超越前綴)
*、/、MOD、SHL、SHR
HIGH、LOW
+、-
EQ、NE、LT、LE、GT、GE
NOT
AND
OR、XOR
優先順序:低
SHORT
MASM 數值和運算符
MASM 表達式中的數值
MASM 表達式中的數值能夠以 16, 10, 8 或者 2 為基數方式輸入。
n (Set Number Base) 命令可用來設置預設基數為 16, 10 或者 8。所有不帶前綴的數值都以該基數來解釋。通過指定 0x 前綴(十六進位),0n 前綴(十進位),0t 前綴(八進位),或者 0y 前綴(二進位)能夠掩蓋預設基數。也可以添加一個 h 後綴表示十六進位數值。數值裡面的字母可以是大寫或者小寫,所以 "0x4AB3", "0X4aB3", "4AB3h", "4ab3h" "4aB3H" 都表示相同意思。
如果表達式中前綴後面沒有跟一個數值,它被讀作 0。所以,0 可以寫成三種形式:0,前綴後面跟一個 0,單獨一個前綴。例如,在十六進位下,"0", "0x0" 和 "0x" 都表示相同意思。
能夠以 xxxxxxxx`xxxxxxxx 格式輸入 64 位的十六進位數值,或者忽略當中的重音符號(`)。包含重音符號會使得自動符號擴展無效,詳細請看符號擴展。
MASM 表達式中的符號
在 MASM 表達式中,任意符號的數值都是它的內存地址。根據引用符號的不同,可以是全局變數、局部變數、函數、段、模塊或者任何其它可識別標籤的地址。
如果會混淆,你可以給符號添加一個模塊名和一個感嘆號(!)做為前綴,或者只加一個感嘆號。關於符號識別,詳細請看符號語法和符號匹配。
兩個冒號(::)或者兩條下劃線(__)可以用來標誌類的成員。
只有以模塊名和感嘆號為前綴的符號名中才能使用重音符號(`)或者撇號(')。
MASM 表達式中的數值運算符
表達式的任意組件都可以用一元運算符來修改,任意兩個組件都可以用二元運算符組合起來。一元運算符優先於二元運算符。當用到多個二元運算符時,遵循已定的優先順序規則。
總是可以用圓括弧來掩蓋優先順序規則。
如果 MASM 表達式的某一部分被圓括弧括住並有兩個 @ 前綴 - @@( ... ) - 該部分將根據 C++ 表達式規則來解析。在兩個 @ 記號之間以及和左圓括弧之間不能有空格。也可以通過使用 @@c++( ... ) 或者 @@masm( ... ) 指定表達式求解器。
當執行算術運算時,MASM 表達式求解器把所有的數值和符號當做 ULONG64 類型。
一元地址運算符定址時假定 DS 為預設段。按運算符的優先順序順序計算表達式。如果兩個相鄰的運算符優先順序一樣,則從左往右計算表達式。