Próbuję wydrukować liczbę zmiennoprzecinkową w zespole x86_64, ale po prostu wypisuje wartość jako zero.Sposób drukowania pojedynczej precyzji zmiennoprzecinkowej za pomocą printf
Jest już kilka pytań na ten temat. Jedna okazała się być rozwiązana, zapewniając, że you set the number of vector registers you're using in %al. Inny pokazał, że you need to have a stack alignment of 16 bytes. Ale robię obie te rzeczy i nadal nie otrzymuję poprawnego wyniku.
To jest mój program:
# prints a floating point value
.section .rodata
.fmt: .string "num: %f\n"
.num: .float 123.4
.section .text
.global main
.type main, @function
main:
subq $8, %rsp # 16-byte alignment
# print my number
movss .num, %xmm0 # load float value
movq $.fmt, %rdi # load format string
movb $1, %al # use 1 vector register
call printf
# exit
addq $8, %rsp # undo alignment
movq $0, %rax # return 0
ret
To niesamowite, że pomimo pisania C++ od lat i używania printf wiele, wiele razy ... Nigdy o tym nie wiedziałem. – cgmb
@ cgmb: tak, to nie oczywiste. Zapominam, ale może nie być nawet możliwe przekazanie 'float' do funkcji var-args w C. Reguły promocji określają konwersję na' double'. Spodziewam się, że gdyby było to możliwe, przynajmniej GNU C miałby specyfikator formatu. (Jak '% hf' lub coś podobnego).Dla mnie naprawdę ograniczałem się do tego ograniczenia, patrząc na asm, ponieważ w przeciwnym razie kompilator zawsze dokonuje konwersji dla ciebie. (Również, od faktycznie chcąc wydrukować 'float' z formatowaniem w stylu"% a "w formacie szesnastkowym) –