虽然我知道使用编译器内部函数和
以下是这个短程序:
printf_chk
,并将数据放入.rodata
段是最好的选择,但我正在努力深入了解汇编语言,并对简洁的代码感兴趣。关于printf
,我有些疑问。我知道在哪里放置参数,也知道如何使用%al
来处理可变参数,但它似乎需要额外的堆栈空间,我无法解释这一点。以下是这个短程序:
.text
.globl main
main:
movsd value(%rip), %xmm0 # value to print
movl $format, %edi # format string
movl $1, %eax # one floating-point arg
call printf
movl $0, %eax # return 0 from main
ret
.align 8
value: .double 74.321
format: .asciz "%g\n"
出现了段错误。
但是,当我为帧添加额外的堆栈空间时,它可以正常工作:
.text
.globl main
main:
subq $8, %rsp # ADD SOME STACK SPACE TO FRAME (WHY?)
movsd value(%rip), %xmm0 # value to print
movl $format, %edi # format string
movl $1, %eax # one floating-point arg
call printf
movl $0, %eax # return 0 from main
addq $8, %rsp # REMOVE ADDED STACK SPACE
ret
.align 8
value: .double 74.321
format: .asciz "%g\n"
可能是对齐问题吗?(当value
和format
在.rodata
部分时,我遇到了同样的问题。)