gpt4 book ai didi

assembly - 如何使用 printf 打印单精度 float

转载 作者:行者123 更新时间:2023-12-04 13:58:30 25 4
gpt4 key购买 nike

我正在尝试在 x86_64 程序集中打印一个浮点数,但它只是将值打印为零。

关于这个已经有几个问题了。通过确保 you set the number of vector registers you're using in %al 似乎可以解决一个问题。 .另一个显示you need to have a stack alignment of 16 bytes .但是,我正在做这两件事,但仍然没有得到正确的输出。

这是我的程序:

# 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

最佳答案

printf(3) 's %f format specifier wants a double 。没有办法让 printf 接受 float ,只有 doublelong double

C 的默认参数提升 指定对 foo(char *fmt, ...) 等可变参数函数的调用将 float 提升为 double ,并将窄整数类型的通常整数提升为 int ,用于匹配原型(prototype)的 ... 部分的尾随 args。 (这同样适用于调用没有原型(prototype)的函数的所有参数。) N1570 6.5.2.2 Function calls, subsections 6 and 7

因此,C 无法让调用者将 float 传递给 printf ,因此它没有对其进行转换,并且 %f 表示 double 。 ( %lf 也适用于 double ,假设实现忽略它进行非整数/wchar_t 转换。Accepting %lf for double is required in C99/C11 and C++11 printf implementations ,因此您可以安全地使用与 %lf 相同的 double 格式字符串 printfscanf )。

请注意,scanf 是不同的,因为 float *double * 不受这些促销事件的影响。

在这种情况下, 使用 CVTSS2SD .num(%rip), %xmm0 加载。

如果您查看 compiler output ,您会看到 gcc 完成了您所做的一切,并且首先 pxor -zero 寄存器以打破对 %xmm0 旧值的错误依赖。 ( cvtss2sd 糟糕的设计使目标的高 64 位保持不变。) gcc 在谨慎方面犯了错误,并在许多情况下插入异或归零指令来破坏错误的依赖关系。

你可能得到 0 因为 xmm0 的高位恰好为零 。当 printf 将 xmm0 的低 64 位视为 double (IEEE binary64 on x86) 时,它会在尾数的低 32 位中找到 123.4f 的位模式,其余为零。作为一个 64 位的 double ,这个位模式代表一个非常小的(次正常的)数字,所以它与 %f 一起出现为零。

您可以尝试使用 float 等价物(例如在 http://www.h-schmidt.net/FloatConverter/IEEE754.html 上),在低半部分设置一些位以查看您得到的结果。

如果您使用 %g(科学记数法)或 %a(double 位模式的十六进制表示),则会显示非零位。 (除非您在 MXCSR 中启用了非正规为零模式。)

关于assembly - 如何使用 printf 打印单精度 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37082784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com