2 つの単精度浮動小数点数を取り、それらを加算して結果を表示する小さなアセンブリ プログラムを作成しています。ただし、後で使用するために結果をレジスタに保存したいと思います。作業を開始するために、C++ プログラムをアセンブリ プログラムにコンパイルし、それを編集しようとしました。ただし、次のような結果が得られます。
movl $0x49742408, %eax
movl %eax, 20(%esp)
movl $0x49f42405, %eax
movl %eax, 24(%esp)
flds 20(%esp)
fadds 24(%esp)
fstps 28(%esp)
flds 28(%esp)
fstpl 4(%esp)
movl $.LC2, (%esp)
call printf
movl $0, %eax
まず、フロートに関しては、s
32ビットとl
64ビットを意味するのは正しいですか? 28(%esp)
次に、データ レジスタ スタックに格納するためだけに32 ビットの float 値を にポップするのはなぜですか? これらの 2 行を削除すると、結果の精度が低下します。これは奇妙です。最後に、データ レジスタ スタックを再度ポップしますが、今回は 64 ビット値です。単精度の 32 ビット値が必要です。ただし、に変更l
するとs
、0が得られます。正確に何が起こっているのか知っている人はいますか?