私の大学では、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ではありません...
[編集:] 面白い事実。驚くべきことに、プログラムを実行するたびに結果が変わります。