根据this reference和this reference,shr
指令支持通过1
,CL
寄存器和立即数进行移位。但是,我似乎无法立即获得工作价值。当我有此代码时:
#include <stdint.h>
int main() {
uint64_t v = 15;
asm ("shr %[v], $0x04\t\n"
: [v] "+r" (v)
:
: "cc"
);
return v;
}
我收到此错误消息:
$ gcc -masm = intel foo.c
foo.c:汇编程序消息:
foo.c:5:错误:“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
(您也可以将
shr
替换为shrq
以明确使用64位操作数)如果仍要像使用ojit_code一样使用Intel语法,则必须从立即值中删除美元符号:
asm ("shr %[v], 4\n"
...)