私のマシン (Mac OS X、つまり AMD/Linux ABI) と同じ結果が得られます。浮動小数点パラメーターは XMM レジスターで渡され、整数パラメーターは整数レジスターで渡されます。printf
を使用してそれらを取得するとva_arg
、フォーマットを確認すると XMM から取得し、 を確認%f
すると他のレジスタから取得します%lld
。-O0
私のマシンでコンパイルされた( )プログラムの逆アセンブリは次のとおりです。
1 _main:
2 pushq %rbp
3 movq %rsp,%rbp
4 subq $0x20,%rsp
5 movq $0x3f1e68a0d349be90,%rax
6 move %rax,0xf8(%rbp)
7 movq $0x00000000,0xf0(%rbp)
8 movq 0xf0(%rbp),%rdx
9 movq 0xf0(%rbp),%rsi
10 movsd 0xf8(%rbp),%xmm0
11 movq 0xf8(%rbp),%rax
12 movapd %xmm0,%xmm1
13 movq %rax,0xe8(%rbp)
14 movsd 0xe8(%rbp),%xmm0
15 lea 0x0000001d(%rip),%rdi
16 movl $0x00000002,%eax
17 callq 0x100000f22 ; symbol stub for: _printf
18 movl $0x00000000,%eax
19 leave
20 ret
そこで何が起こっているかを見ることができます - フォーマット文字列が に渡され%rdi
、次にパラメータが (順番に) 、 %xmm0
、%xmm1
、%rsi
に渡されます%rdx
。それらを取得するprintf
と、別の順序 (フォーマット文字列で指定された順序) でポップオフされます。つまり、それらをポップすることを意味します: %rsi
、%xmm0
、%rdx
、%xmm1
、表示される結果を提供します。2
inは、%eax
渡された浮動小数点引数の数を示します。
編集:
これは最適化されたバージョンです。この場合、短いコードの方が理解しやすいかもしれません。説明は上記と同じですが、ボイラープレート ノイズが少し少なくなっています。浮動小数点値はmovsd
4 行目でロードされます。
1 _main:
2 pushq %rbp
3 movq %rsp,%rbp
4 movsd 0x00000038(%rip),%xmm0
5 xorl %edx,%edx
6 xorl %esi,%esi
7 movaps %xmm0,%xmm1
8 leaq 0x00000018(%rip),%rdi
9 movb $0x02,%al
10 callq 0x100000f18 ; symbol stub for: _printf
11 xorl %eax,%eax
12 leave
13 ret