考虑下面的简短程序。

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

这个程序编译得很好,但当它运行时,它会在初始movq指令上分段。
我肯定漏掉了一些显而易见的东西,但我希望这里有人能为我指出。
我在Debian8上运行,内核是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

最佳答案

事实证明,我写asm已经太久了,我忘记了在AT&T语法中,必须用$作为直接值的前缀。我在仔细检查AT&T语法时发现了这个提示。

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

movq 0x5F5E100, %rcx(数字上没有$)是从绝对地址0x5F5E100加载的

关于c - movq指令出现段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37955538/

10-11 20:53