最近、fp番号の小さなプログラムを書いていました。 まず、私はその後、私は二重の移動なぜscanfからdouble型ではなくfloat型になるのですか?
segment .data
scanf_fmt:
db "%f%ld", 0
segment .bss
align 16, db 0
x resq 1 ; for double fp
number resq 1 ; for integer
align 16, db 0
res resq 1 ; for double fp
lea rdi, [fmt]
lea rsi, [x]
lea rdx, [number]
xor eax, eax ; number of fp values(edited from mov rax, 1 ,still looks the same)
call scanf
(SSE手順について)整列場所に二重のFPをお読みください。
movsd xmm0, [x]
は、それから私は、デバッグ始まっ:私は読むことをscanfのため1.6
で入力。ラベルx
で
100 movsd xmm0, [x]
(gdb) p/f x
$1 = 1.60000002
(gdb) n
(gdb) p $xmm0
$2 = {v4_float = {1.600000002, 0, 0, 0}, v2_double = {5.2..., 0}, ...
浮動小数点値を移動しますが(私が使用しmovsd
、)ではないとして、二重フロート(movss
)ここ
を何が起こっているように? scanf(3)
から
完全なプログラム、作成方法、実行方法、実行時に入力した内容を表示する必要があります。代わりに、デバッガに表示されると思われるものが必要です。 –
'mov rax、1'はバグです。整数レジスタにポインタを二重に渡し、xmm regsにゼロFP引数を渡します。 –
@RossRidgeビルド: 'yasm -f elf64 -g dwarf2 main.asm; gcc -o main main.o' 実行: '。/ main' 型付き:' 1.6' '{v4_float = {smth、0、0、0}、v2_double = {1.6、0}、..のようなものがあります。 。 –