3.2 表達式的類別與類型
阿新 • • 發佈:2018-10-31
含義 資料 因此 不同的 eof 類型 存儲器 器) 字節
在BASM的語句中,每一個表達式都必須能夠在編譯器中計算出準確的值或者尋址地址。如果不能滿足這個條件,語句不會被編譯通過。事實上,對於指令系統來說,每一個表達式都最終對應於一個確定的操作數。
因此,表達式的類別(Expresion classes),按表達式的計算結果可分成三類:寄存器、立即數和內存引用(存儲器)。
與內存引用相關的表達式,會涉及到存儲器尋址模式的問題,請查閱相關資料。下一小節會簡要講述在BASM中訪問Delphi所定義的變量與常量,但不涉及尋址模式。
在BASM中,表達式的類型(Expression types)是一個長度值,它是指表達式值占用空間的字節數,即值的大小。這與Delphi中SizeOf()函數含義是一樣的。但BASM中用關鍵字TYPE來返回表達式的類型(大小)。
如下例:
type TArr=array [0..10] of char;//SizeOf(TArr)=11 var Arr: TArr asm mov eax,TYPE Arr mov eax,TYPE TArr mov eax,TYPE Arr[2] end;
上面的三行匯編語句都會向eax送入值11。第三行看起來是要取Arr數組元素的長度,但實際上只能取到數組的長度。
較為復雜的表達式,其類型由第一個操作數的類型來決定。因此下面這個語句送入eax的值仍然為Arr的類型值11:
mov eax,TYPE (Arr +2)
這裏的括號不能理解成函數,而是用來改變運算優先級的。
同樣的道理,在BASM中,以下兩條語句面對的命運是不同的:
mov eax,2+Arr mov eax,Arr +2
第一代碼行會被BASM理解成Arr的地址值+2。而第二行代碼右邊表達式的長度為11,不能送入寄存器eax,因而根本不會被編譯通過。
3.2 表達式的類別與類型