我有像这个例子的简单代码:
int main() {
double i_3 = 4.1; // 8 bytes
return 0;
}
让我们用-S选项编译这个样本:
g++ -S -o asm_types.s asm_types.cpp
编译器返回带有以下代码的.s文件:
.file "asm_types.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movabsq $4616302208045442662, %rax
movq %rax, -8(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits
我想了解这行.s文件
movabsq $4616302208045442662, %rax
什么是4616302208045442662?
由于
答案 0 :(得分:0)
您基本上想要阅读IEEE 754,特别是它如何以二进制形式存储(编码)值。但简而言之,它将数量分为三个主要部分(在这种情况下为64位):
你可能会问的主要问题是,像4.1那样简单的事情是如何变成如此多的随机看点(4616302208045442662h)。这主要是数字如何分解和缩放的结果。缩放是必要的,以提供可以在非常小的数字和非常大的数字之间滑动的等效数量的significant digits。
读数: