У меня есть следующий код, где b
инициализируется значением с плавающей запятой 123.45 :
global _start
section .data
;a : dw 999 ; declare word
b : dq 123.45 ; declare quad word (double precision)
section .bss
res : resq 1 ; reserve 1 quad word for result
section .text
_start :
nop
Я создаю файл объекта (sanityTest.o) и исполняемый файлФайл (sanityTest) выглядит следующим образом.Я работаю на компьютере x64:
nasm -f elf64 -F dwarf -g sanityTest.asm -o sanityTest.o
ld -m elf_x86_64 -o sanityTest sanityTest.o
Затем я пытаюсь прочитать значение b
в GDB следующим образом:
(gdb) file sanityTest
Reading symbols from sanityTest...done.
(gdb) break _start
Breakpoint 1 at 0x4000b0
(gdb) run
Starting program:
Breakpoint 1, 0x00000000004000b0 in _start ()
(gdb) print b
$1 = -858993459
(gdb) print/f b
$2 = -107374184
(gdb)
Почему ни print b
, ни print/f b
отобразить значение 123.45 ?
Дополнительная информация:
Если я скомпилирую код с закомментированной строкой b : dq 123.45
и строка a : dw 999
без комментариев, я могу вывести целочисленное значение a
из 999 :
(gdb) p a
$1 = 999
Если я скомпилирую обе строки без комментариев, я могу напечататьни a
, ни b
.Значение для b
такое же, как и раньше, и я понятия не имею, что сейчас печатается для a
:
(gdb) p a
$1 = -858979353
(gdb) p b
$2 = -858993459
(gdb) p/f a
$3 = -107487032
(gdb) p/f b
$4 = -107374184