【问题标题】:Segfault on movq instruction?movq指令的段错误?
【发布时间】:2016-06-21 22:20:39
【问题描述】:

考虑以下短程序。

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                                                                

【问题讨论】:

  • 我对组装几乎一无所知。但也许您想将值 0x5F5E100 复制到 %rcx 并在没有意识到的情况下交换操作数?
  • 请将编译器生成的汇编代码(使用-S编译)添加到您的问题中。

标签: c x86-64


【解决方案1】:

事实证明,我写 asm 已经太久了,我忘记了在 AT&T 语法中必须在立即值前面加上 $。我在仔细检查 AT&T 语法时发现了提醒 here

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

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

【讨论】:

  • 如果您知道方括号指定了内存操作数,那么在 Intel 语法中反汇编会提示您使用的是 mov r64, r/m64 而不是 mov r64, imm32。 (例如objdump -Mintel -drw foo.o
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多