从函数调用printf时的分段错误 - 64位

时间:2018-04-18 12:21:13

标签: linux assembly printf x86-64 libc

当我从函数调用printf函数时出现分段错误,但是当从main调用时它完全正常:

CODE:

extern  printf

SECTION .data
    msg:    db "Hello", 0 ; Zero is Null terminator 
    fmt:    db "%lf", 10, 0 ; printf format string follow by a newline(10) and a null terminator(0), "\n",'0'
    d1: dq 13.0
    d2: dq 15.0
    result : dq 0

SECTION .text
    global main

main:

    push rbp ; Push stack

      ; mov  rdi,fmt ; set the format for print
      ; mov rsi,msg ; set first parameter
      ; mov rax,1 ; one floating point
      ; movq xmm0, [d1]
      ; call printf

    call get_input 

    pop rbp     ; Pop stack
    mov rax,0   ; Exit code 0
    ret         ; Return


    get_input:
       mov  rdi,fmt ; set the format for print
       mov rsi,msg ; set first parameter
       mov rax,1 ; one floating point
       movq xmm0, [d1]
       call printf        
    ret

制作文件:

nasm -g -f elf64 -F dwarf printf.s -o printf.o
gcc -g -Wall -o printf printf.o

1 个答案:

答案 0 :(得分:0)

在调用printf之前,堆栈需要16字节对齐。

在调用get_input之前对齐,并且返回地址使其未对齐,因此get_input需要减去8以再次对齐它。