3.2 表达式的类别与类型
Posted yishen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,因而根本不会被编译通过。
以上是关于3.2 表达式的类别与类型的主要内容,如果未能解决你的问题,请参考以下文章
用于 WordPress 的 PHP 片段,用于获取所有产品子类别