根据该参考文献和该参考文献,该shr指令支持1通过CL寄存器和立即值进行移位.但是,我似乎无法立即获得工作价值; 当我有这个代码时:
#include <stdint.h>
int main() {
uint64_t v = 15;
asm ("shr %[v], $0x04\t\n"
: [v] "+r" (v)
:
: "cc"
);
return v;
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
$ gcc -masm=intel foo.c foo.c: Assembler messages: foo.c:5: Error: operand size mismatch for `shr'
如何将立即值传递给shr(不加载CL,我关心,因为我正在优化寄存器压力瓶颈).
您正在使用具有Intel汇编语法的指南.GNU程序集(GAS)使用AT&T语法,它具有操作数的逆序.改变他们的顺序似乎做得很好:
uint64_t v = 0xffff;
asm ("shr $0x04, %[v]\n"
: [v] "+r" (v)
:
: "cc"
);
printf("%llx", v); // 0xfff
Run Code Online (Sandbox Code Playgroud)
(你也可以替换shr使用shrq,使64位运算的使用显式)
如果您仍然希望使用英特尔语法-masm=intel,则必须从立即值中删除美元符号:
asm ("shr %[v], 4\n"
...)
Run Code Online (Sandbox Code Playgroud)