关于movq指令的Segfault?

时间:2016-06-21 22:20:40

标签: c x86-64

考虑以下简短程序。

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                                                                

1 个答案:

答案 0 :(得分:4)

事实证明,自从我写了asm以来已经太久了,我忘记了必须在AT& T语法中用$作为立即值。我在仔细检查AT& T语法时找到了提醒here

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

movq 0x5F5E100, %rcx(数字上没有$)来自绝对地址0x5F5E100