购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.7 在汇编语言中指定操作数尺寸

80x86上的汇编器通过两种机制指定操作数尺寸:

●操作数使用类型检查来说明尺寸—多数汇编器都这么做。

●指令本身指定了尺寸—Gas是这么做的。

举例来说,我们考虑下列3条HLA的mov指令:

每个情况里都由寄存器操作数说明了mov指令传送到对应寄存器的数据尺寸。MASM采用类似的语法,只是操作数要互相调换位置:

一定要注意的是,上面6条语句的指令助记符都是一样的,均为mov。正是操作数而非指令助记符指明了要传送数据的尺寸。

注意: Gas的现代版本也允许我们无须使用b或w后缀,就能以操作数(寄存器)的尺寸指定运算规模。然而,本书将继续沿用诸如movb或movw这类助记符,以避免Gas较早版本带来的混淆。具体内容请参见3.7.3节。

3.7.1 HLA的类型强制转换

前面指定操作数的方法存在一个问题。请考虑下列的HLA示例:

该指令是含糊不清的:EBX指向的内存位置可以是字节、字或双字。指令并未把操作数的尺寸告知汇编器。要是遇到这样的指令,汇编器就会报错,我们必须明确指出内存操作数的尺寸。如果是在HLA中,这可以通过类型强制转换运算符实现:

通常用下列HLA语法能将任何内存操作数强制转换成适当尺寸的:

其中, new_type 表示byte、word或dword等数据类型, memory 为要强制转换类型的内存地址。

3.7.2 MASM的类型强制转换

MASM同样存在这一问题。应当这么使用强制转换运算符来指定内存单元:

当然,将例子中的word替换成byte或dword,就能将内存单元强制转换为字节或双字尺寸。

3.7.3 Gas的类型强制转换

Gas汇编器无须强制转换运算符,因为它采用了截然不同的技术来指定操作数的尺寸—由指令助记符明确说明尺寸。不是用单一一个助记符mov,Gas用了4种指令助记符,由mov和一个表示尺寸的字符后缀组成,具体如下:

movb 传送8位数据(字节byte)

movw 传送16位数据(字word)

movl 传送32位数据(长整型long)

movq 传送64位数据(long long)

采用这些指令助记符时,即使操作数尺寸没有明确,也永远不会产生歧义。例如:

有了这些基础知识,你应该能够理解典型编译器的输出了。 cZUkarEi4+MS5KdGkOKO+C+f1VVhzHl78XtxxkZjx/w654JA/VogMHOpnNDGP1kW

点击中间区域
呼出菜单
上一章
目录
下一章
×