关于movq指令的Segfault?

考虑以下简短程序。

int main(){ asm("movq 0x5F5E100, %rcx;" "startofloop: ; " "sub 0x1, %rcx; " "jne startofloop; "); } 

这个程序编译得很好,但是当它运行时,它会在初始的movq指令上发生段错误。

我一定错过了一些明显的东西,但我希望有人能为我指出这一点。

我在Debian 8上运行,内核3.16.0-4-amd64,如果相关的话。


为了将来参考,这是编译器生成的内容。

 main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 #APP # 2 "asm_fail.c" 1 movq 0x5F5E100, %rcx;startofloop: ; sub 0x1, %rcx; jne startofloop; # 0 "" 2 #NO_APP 

事实certificate,自从我编写asm以来已经太久了,我忘记了必须在AT&T语法中使用$前置立即值。 当仔细检查AT&T语法时,我在这里找到了提醒。

 asm("movq $100000000, %rcx;" "startofloop: ; " "sub $0x1, %rcx; " "jne startofloop; ");