コンパイラの組み込み関数を使用するのが最善であることはわかっていますが、さらに言えば、セクション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ます。)