1

私の大学では、AT&T Syntax を使用した IA32/x86 アセンブラーを紹介されています。しかし、説明には重要な情報が欠けています。

スタックから FPU に 4 バイトの浮動小数点数を移動するにはどうすればよいですか? flds で試しましたが、期待どおりに機能しませんでした...

例コード:

.data
        fl:     .float 12.412
        test:   .string "Result: %f\n"

.text
.global main

main:
        # Prepare the stack (8 byte so i can use it for printf later)
        subl $8, %esp
        # Load the variable fl which holds 12.412
        fld fl
        # Store the previously loaded value as single precision (4 byte) to the stack
        fstps (%esp)
        # Load the value from the stack again and expect it to be single precision (as flds ends with s)
        flds (%esp)


        # Push it to the stack again. But this time as double precision value als printf expects floats to be 8 bytes long 
        fstp (%esp)
        pushl $test
        call printf

        movl $1, %eax
        int $0x80

しかし、出力は次のとおりです。

結果: -0.491594

予想通り12.412ではありません...

[編集:] 面白い事実。驚くべきことに、プログラムを実行するたびに結果が変わります。

4

1 に答える 1