码迷,mamicode.com
首页 > 其他好文 > 详细

3.2 表达式的类别与类型

时间:2018-10-31 10:43:38      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:条件   编译器   types   长度   括号   决定   定义   sse   表达   

  在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 表达式的类别与类型

标签:条件   编译器   types   长度   括号   决定   定义   sse   表达   

原文地址:https://www.cnblogs.com/YiShen/p/9881043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!