【发布时间】:2018-08-16 18:34:25
【问题描述】:
出于好奇,我使用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 位整数的位模式,并将其解释为双精度浮点数的位模式。但是,究竟如何?我必须将模式解释为 IEEE754 双精度吗?按什么顺序?
【问题讨论】:
-
第一个long(32位)是64位双浮点数的下半部分,第二个是上半部分。您可以将这两个值转换为十六进制,然后将它们连接在一起以获得 64 位十六进制值。 64 位十六进制值将采用 IEEE-754 格式。在这种情况下,转换第一个值是 HEX
33333333。第二个是C0153333。 64 位 HEX 值为C015333333333333,应为 -5.3。 -
您可以使用在线转换器将 64 位编码的 IEE754 值转换为十进制浮点数:babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html
-
维基百科以及其他地方显示了 IEEE 754 浮点数的细分/格式,因此您可以查看这些位的位置/方式。更容易从单精度开始,然后逐步提高,但与此同时,随着您逐步提高,它只是更多的位。格式的工作方式相同。
-
在 CE 中,您可以将鼠标悬停在常量上以查看十六进制值。在这种情况下,Clang 和 ICC 输出更具可读性,您应该尝试这些
标签: gcc assembly floating-point x86-64