根据this referencethis referenceshr指令支持通过1CL寄存器和立即数进行移位。但是,我似乎无法立即获得工作价值。当我有此代码时:

#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位操作数)

如果仍要像使用o​​jit_code一样使用Intel语法,则必须从立即值中删除美元符号:
asm ("shr %[v], 4\n"
     ...)

09-27 10:52