强制整数常量为四字

时间:2013-11-18 21:28:11

标签: c assembly x86-64

为类编写一个编译器,类中没有人可以弄清楚为什么我们不能做直接的事情。

cmpq %r13, %r10
movq $0, %r10
cmovne $1, %r10

我最好的猜测是,由于cmovXX没有明确定义其参数的大小,如movq或movl,因此$ 1不知道有多大,因此会抛出类型不匹配的发音。

我的问题是,如何强制整数常量为四字? $ 1q没有用,所以我猜对了。

谢谢!

1 个答案:

答案 0 :(得分:4)

不是真的。 cmov根本不可用(英特尔,也没有AMD使用立即操作数创建此特定指令的编码)。它仅在寄存器和存储器位置上运行。

在AT& T语法中强制指令的特定大小是通过将一个大小前缀附加到指令的助记符来完成的 - 就像你完成它一样。

x86-64指令集中唯一可以接受四字(64位)立即数的指令是带有64位寄存器的mov指令。但是,执行movq $0, %rax将为您提供32位立即的普通编码。为了强制汇编器立即发出64位,你必须使用movabs $0, %rax