c++ double representation asm
c++ double representation asm
我有一个简单的代码,像这个例子:
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?
谢谢
您实际上需要阅读IEEE 754,特别是它如何以二进制形式存储(编码)值。但简而言之,它将数字分成三个主要部分(在本例中为64位):
- 符号(1位)
- 指数(11位)
- 分数(52位)
你可能会问的主要问题是,像4.1这样简单的东西是如何变成这么多随机看起来的比特的(4616302208045442662h)。这主要是数字如何分解和缩放的结果。缩放是必要的,以提供相等数量的有效数字,可以在非常小的数字和非常大的数字之间滑动。
阅读:
- http://grouper.ieee.org/groups/754/faq.html
- https://en.wikipedia.org/wiki/Double-precision_floating-point_format
相关文章:
- 使用C++获取程序的 ASM
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- Extern "C"错误在'int'之前'asm'或'__attribute__'
- 了解 C/C++ 中 Windows / MSVC 的一些反调试内联 asm
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何使用"asm volatile"编写 btr 指令
- objdump 不显示机器代码,但显示 ASM
- 未使用的 asm() 在不受支持的体系结构上的行为
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 为什么发出空asm命令会交换变量
- C++-更改另一个文件的ASM指令
- 尝试用纯 c 编程 arduino,得到以下错误:预期的"="、""、";",'asm'或"打印"之前的'__attribute__'|
- C++/ASM:按值传递使用 xmm0,但按引用使用 rdi
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 优化了 VC++ 和 ASM 中的代码
- 如何在 Linux asm 中正确返回双精度值
- 使用读取[EBP 4]的MSVC内联ASM移植到64位
- c++ double representation asm