这是 printf 函数的原型
int printf(const
char* format,
...);
它接受一个格式化字符串 format 和不固定的若干个参数
这些参数中的浮点数会依次存放在 %xmm0 ~ %xmm7 寄存器,如果浮点数个数超过8个,则超出部分存放在栈上
这些参数中的非浮点数会依次存放在 %edi %edx %ecx %r8d %r8d 寄存器上,如果非浮点数个数超过5个,则超出部分存放在栈上
数据类型/参数序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8+ |
---|
printf 函数在格式化字符串的时候,从左往右扫描 format 字符串中的控制符
比如
printf("%d %f %d %f",
1,
2.0,
3,
4.0);
参数存放:1, 2.0, 3, 4.0
format 中参数读取:”%d %f %d %f”
以下是用 objdump 后的反汇编代码,也可以证明以上结果
400535:
48 ba 00
00
00
00
00 movabs $0x4010000000000000,%rdx
40053c:
00
10
40
40053f:
48 b8 00
00
00
00
00 movabs $0x4000000000000000,%rax
400546:
00
00
40
400549:
48
89
55 f8 mov %rdx,-0x8(%rbp)
40054d: f2 0f
10
4d f8 movsd -0x8(%rbp),%xmm1
400552: ba 03
00
00
00 mov $0x3,%edx
400557:
48
89
45 f8 mov %rax,-0x8(%rbp)
40055b: f2 0f
10
45 f8 movsd -0x8(%rbp),%xmm0
400560: be 01
00
00
00 mov $0x1,%esi
400565: bf 10
06
40
00 mov $0x400610,%edi
40056a: b8 02
00
00
00 mov $0x2,%eax
40056f: e8 9c fe ff ff callq 400410
<printf@plt>
回到题主的问题,为什么以下代码的输出结果是0?
printf(“%f
”,3/2)
先看参数存放:3/2
format 中参数读取:”%f ”
我们把参数存放到了 %edi 寄存器了,却希望从 %xmm0 寄存器中读这个参数,显然不会成功。
但是从输出结果为0看,应该是当时 %xmm0 寄存器的数值恰好是0,而这仅仅是巧合而已。
以上是在 x86_64 环境下测试的结果。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有