2013-11-19 3 views
1

Я новичок в x86-64 сборки, и я бегу простой код x64 сборки:ошибки сегментации при вызове C Функция

.global main 

.text 
main:         
    mov  $message, %rdi  
    sub  $8, %rsp    
    call puts     
    add  $8, %rsp    
    ret       
message: 
    .asciz "Hello, World"   

После компиляции кода с использованием GCC под Cygwin, он всегда возвращает мне ошибку :

segmentation error 

, но если удалить

call puts 

программа работает без ошибок. Так в чем проблема с этим заявлением о вызове?

+0

Возможно, вам не хватает функции вызова функции ABI. Это зависит от платформы. Напишите эквивалентную программу C и скомпилируйте ее с помощью '-S -O3'. Полученный ассемблер должен дать вам подсказку о том, что требуется платформе. Как правило, не очень хорошо писать эту функцию в ассемблере. По крайней мере, намного проще написать обертку на C и иметь специальные ассемблерные части внутри с '__asm__'. –

ответ

0

Вы должны определить message в данные только для чтения раздел ...
Как это ...

.rodata        # read-only data section 
message: 
    .string "Hello, World!" 

На 32-битной машине с AT & T синтаксис, код будет быть следующим:

.section .rodata 
msg: 
    .string "Hello, World!"  # msg is in the read only data section. 

.section .text 
    .globl main 
    .type  main, @function 
main: 
    pushl %ebp 
    movl  %esp, %ebp 
    andl  $-16, %esp 
    subl  $16, %esp 

    movl  $msg, (%esp)    # We move the argument of puts to (%esp) 
    call  puts      # puts is called 

    movl  $0, (%esp)    # moved the argument of(0) exit to (%esp) 
    call  exit      # exit is called 
Смежные вопросы