0

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

まず、フロートに関しては、s32ビットとl64ビットを意味するのは正しいですか? 28(%esp)次に、データ レジスタ スタックに格納するためだけに32 ビットの float 値を にポップするのはなぜですか? これらの 2 行を削除すると、結果の精度が低下します。これは奇妙です。最後に、データ レジスタ スタックを再度ポップしますが、今回は 64 ビット値です。単精度の 32 ビット値が必要です。ただし、に変更lするとs、0が得られます。正確に何が起こっているのか知っている人はいますか?

4

1 に答える 1