c - C 中的浮点数组初始化 - x86 asm 编译器输出 - 找不到 ieee754 表示位/十六进制
问题描述
我想了解以下浮点数组的 x86 程序集中的初始化。我用“gcc -O0”编译它。
#include <stdio.h>
int main(void) {
float d[] = {1, 2, 3, 4};
printf("d=[%f, %f, %f, %f]\n", *(d+0), *(d+1), *(d+2), *(d+3));
return 0;
}
浮点表示中的 1 是 0x3f800000,2 是 0x40000000,3 是 0x40400000,4 是 0x40800000。我在汇编程序输出中找不到任何这些数字(0x3f8、0x400、0x404、0x408)。但为什么?
我得到了以下反汇编:
0000000000001169 <main>:
1169: f3 0f 1e fa endbr64
116d: 55 push %rbp
116e: 48 89 e5 mov %rsp,%rbp
1171: 48 83 ec 20 sub $0x20,%rsp
1175: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
117c: 00 00
117e: 48 89 45 f8 mov %rax,-0x8(%rbp)
1182: 31 c0 xor %eax,%eax
1184: f3 0f 10 05 8c 0e 00 movss 0xe8c(%rip),%xmm0 # 2018 <_IO_stdin_used+0x18>
118b: 00
118c: f3 0f 11 45 e0 movss %xmm0,-0x20(%rbp)
1191: f3 0f 10 05 83 0e 00 movss 0xe83(%rip),%xmm0 # 201c <_IO_stdin_used+0x1c>
1198: 00
1199: f3 0f 11 45 e4 movss %xmm0,-0x1c(%rbp)
119e: f3 0f 10 05 7a 0e 00 movss 0xe7a(%rip),%xmm0 # 2020 <_IO_stdin_used+0x20>
11a5: 00
11a6: f3 0f 11 45 e8 movss %xmm0,-0x18(%rbp)
11ab: f3 0f 10 05 71 0e 00 movss 0xe71(%rip),%xmm0 # 2024 <_IO_stdin_used+0x24>
11b2: 00
11b3: f3 0f 11 45 ec movss %xmm0,-0x14(%rbp)
11b8: f3 0f 10 45 ec movss -0x14(%rbp),%xmm0
11bd: f3 0f 5a d8 cvtss2sd %xmm0,%xmm3
11c1: f3 0f 10 45 e8 movss -0x18(%rbp),%xmm0
11c6: f3 0f 5a d0 cvtss2sd %xmm0,%xmm2
11ca: f3 0f 10 45 e4 movss -0x1c(%rbp),%xmm0
11cf: f3 0f 5a c8 cvtss2sd %xmm0,%xmm1
11d3: f3 0f 10 45 e0 movss -0x20(%rbp),%xmm0
11d8: f3 0f 5a c0 cvtss2sd %xmm0,%xmm0
11dc: 48 8d 3d 21 0e 00 00 lea 0xe21(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
11e3: b8 04 00 00 00 mov $0x4,%eax
11e8: e8 83 fe ff ff callq 1070 <printf@plt>
11ed: b8 00 00 00 00 mov $0x0,%eax
11f2: 48 8b 55 f8 mov -0x8(%rbp),%rdx
11f6: 64 48 33 14 25 28 00 xor %fs:0x28,%rdx
11fd: 00 00
11ff: 74 05 je 1206 <main+0x9d>
1201: e8 5a fe ff ff callq 1060 <__stack_chk_fail@plt>
1206: c9 leaveq
1207: c3 retq
1208: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
120f: 00
据我了解初始化在这里完成..但我不明白发生了什么。为什么是 0xe8c?
1184: f3 0f 10 05 8c 0e 00 movss 0xe8c(%rip),%xmm0 # 2018 <_IO_stdin_used+0x18>
118b: 00
118c: f3 0f 11 45 e0 movss %xmm0,-0x20(%rbp)
1191: f3 0f 10 05 83 0e 00 movss 0xe83(%rip),%xmm0 # 201c <_IO_stdin_used+0x1c>
1198: 00
1199: f3 0f 11 45 e4 movss %xmm0,-0x1c(%rbp)
119e: f3 0f 10 05 7a 0e 00 movss 0xe7a(%rip),%xmm0 # 2020 <_IO_stdin_used+0x20>
11a5: 00
11a6: f3 0f 11 45 e8 movss %xmm0,-0x18(%rbp)
11ab: f3 0f 10 05 71 0e 00 movss 0xe71(%rip),%xmm0 # 2024 <_IO_stdin_used+0x24>
11b2: 00
11b3: f3 0f 11 45 ec movss %xmm0,-0x14(%rbp)
11b8: f3 0f 10 45 ec movss -0x14(%rbp),%xmm0
这里发生了什么事?
解决方案
推荐阅读
- swift - Swift,隐藏/删除窗口(查看?)
- c - 指数函数图
- docker - Mysql 通过 ssh 远程连接到 kubernetes pod
- swift - 如何在 UITableiew 标题中添加自定义控件
- laravel - 在 nova 资源索引视图中显示特定的 eloquent 查询
- javascript - How do I change the format for my uptime command its currently hours I would like to change it to days
- firebase - Vue Firebase / Firestore 重复
- java - Spring Boot with Angular 7 frontend - Prevent accessing site from not-logged-in users
- javascript - How to select a value from array randomly for a 2d game (not min, max)
- php - Sublime Text 片段将camelCase 转换为snake_case