2016-06-21 10 views
1

Betrachten Sie das folgende kurze Programm.Segfault auf movq Anweisung?

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

Dieses Programm stellt in Ordnung, aber wenn es ausgeführt wird, es Segfaults auf der anfänglichen movq Anweisung.

Ich muss etwas offensichtlich fehlen, aber ich hoffe, dass jemand hier für mich darauf hinweisen kann.

Ich bin auf Debian 8, mit Kernel 3.16.0-4-AMD64, falls relevant.


Für zukünftige Referenz ist dies, was der Compiler generiert.

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

Ich weiß fast nichts über die Montage. Aber vielleicht wollten Sie den Wert 0x5F5E100 in% rcx kopieren und die Operanden vertauschen, ohne es zu merken? – andre

+0

Fügen Sie bitte den Compiler-generierten Assembler-Code (kompilieren Sie mit '-S') zu Ihrer Frage hinzu. – user3386109

Antwort

3

Es stellt sich heraus, dass es auch schon längst ich asm geschrieben habe, und ich hatte vergessen, dass eine unmittelbare Werte mit $ in AT & T Syntax Vorwort muss. Ich fand die Erinnerung here bei der doppelten Überprüfung AT & T-Syntax.

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

Disassemblierung in Intel-Syntax hätte Sie daran erinnert, dass Sie "mov r64, r/m64" anstelle von "mov r64, imm32" verwendet haben, wenn Sie wissen, dass eckige Klammern einen Speicheroperanden angeben. (z.B. "objdump -Mintel - drw foo.o") –