2016-06-21 85 views
1

请考虑以下短程序。movq指令中的段错误?

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

这个程序编译罚款,但在运行时,它出现segfaults初始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                 
+0

我几乎不知道装配的任何事情。但是也许你想将0x5F5E100的值复制到%rcx中,并且在没有意识到的情况下交换操作数? – andre

+0

请将编译器生成的汇编代码(用'-S'编译)添加到您的问题中。 – user3386109

回答

3

事实证明,它已经太长时间,因为我已经写了ASM,我已经忘记了一个人必须立即前言值与AT & T语法$。当仔细检查AT & T语法时,我发现提醒here

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

如果您知道方括号指定内存操作数,则以英特尔语法反汇编会让您知道您正在使用'mov r64,r/m64'而不是'mov r64,imm32'。 (例如'objdump -Mintel -drw foo.o') –