当我从函数调用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
答案 0 :(得分:0)
在调用printf之前,堆栈需要16字节对齐。
在调用get_input之前对齐,并且返回地址使其未对齐,因此get_input需要减去8以再次对齐它。