gpt4 book ai didi

gcc - 了解汇编列表输出中的 GCC 浮点常量

转载 作者:行者123 更新时间:2023-12-02 20:19:53 24 4
gpt4 key购买 nike

出于好奇,我正在使用 Compiler Explorer查看一些简单 C++ 代码的汇编输出。

考虑以下example

int main(void){
double x = -5.3;
}

汇编输出

main:
push rbp
mov rbp, rsp
movsd xmm0, QWORD PTR .LC0[rip]
movsd QWORD PTR [rbp-8], xmm0
mov eax, 0
pop rbp
ret
.LC0:
.long 858993459
.long -1072352461

我想了解如何使用

.LC0:
.long 858993459
.long -1072352461

取回我的-5.3

我的无知猜测是我需要合并两个 32 位整数的位模式并将其解释为 double float 的位模式。但具体如何呢?我必须将该模式解释为 IEEE754 double 吗?按什么顺序?

最佳答案

But how, exactly? ...

是的,这是 IEEE754 binary64 (aka double) 的整数表示形式位模式。 GCC 总是以这种方式打印 FP 常量,因为它们有时是常量传播的结果,而不是出现在源代码中的 FP 文字。 (它还避免了对汇编程序中 FP 舍入的任何依赖。)

gcc 在其 asm 输出中总是使用十进制作为整数常量,这对人类来说非常不方便。 ( On the Godbolt compiler explorer ,使用鼠标悬停工具提示获取任意数字的十六进制。)

Clang 的 asm 输出更好,并且包含带有数字十进制值的注释:

    .quad   -4605718748921121997    # double -5.2999999999999998

In what order?

x86 的浮点字节序与其整数字节序相匹配:两者都是小字节序。 (情况可能并非如此,但所有现代主流架构都对整数和浮点使用相同的字节顺序,无论是大还是小。 Floating point Endianness? 。和 Endianness for floating point 。)

所以当加载为 64-bit IEEE-754 double 时,内存中的低32位就是double的低32位。

正如@MichaelPetch在评论中解释的那样,第一个/低位双字是0x33333333,第二个/高位双字是0xC0153333因此整个double的位模式为C015333333333333

对于单精度 float ,有 https://www.h-schmidt.net/FloatConverter/IEEE754.html 。 (这非常好,它通过复选框将位分解为二进制,以及十六进制位模式和十进制分数。非常适合学习 FP 指数/有效数字的工作原理。)

对于 double ,请参阅 https://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html 。您可以输入位模式并查看十六进制值。

关于gcc - 了解汇编列表输出中的 GCC 浮点常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883374/

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