2016-06-21 3 views
1

Рассмотрите следующую короткую программу.Segfault на инструкции movq?

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                 
+0

Я ничего не знаю о сборке. Но, возможно, вы хотели скопировать значение 0x5F5E100 в% rcx и поменяли операнды, не осознавая этого? – andre

+0

Пожалуйста, добавьте сгенерированный компилятором код сборки (скомпилируйте с '-S') на свой вопрос. – user3386109

ответ

3

Оказывается, что это было слишком долго, так как я написал ассемблер, и я забыл, что нужно предварить непосредственные значения с $ в AT & T синтаксис. Я нашел напоминание here при двойном проверке AT & T синтаксиса.

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

Демонтаж в синтаксисе Intel означал бы, что вы использовали 'mov r64, r/m64' вместо' mov r64, imm32', если знаете, что квадратные скобки задают операнд памяти. (например, 'objdump -Mintel -drw foo.o') –