1. 程式人生 > >3.2 表達式的類別與類型

3.2 表達式的類別與類型

含義 資料 因此 不同的 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 表達式的類別與類型