虽然我知道最好使用编译器内在函数,并且就此而言,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
。)