3.2 表达式的类别与类型

  在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,因而根本不会被编译通过。

猜你喜欢

转载自www.cnblogs.com/YiShen/p/9881043.html
3.2