这是 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,%rdx40053c: 00 10 4040053f: 48 b8 00 00 00 00 00 movabs $0x4000000000000000,%rax400546: 00 00 40400549: 48 89 55 f8 mov %rdx,-0x8(%rbp)40054d: f2 0f 10 4d f8 movsd -0x8(%rbp),%xmm1400552: ba 03 00 00 00 mov $0x3,%edx400557: 48 89 45 f8 mov %rax,-0x8(%rbp)40055b: f2 0f 10 45 f8 movsd -0x8(%rbp),%xmm0400560: be 01 00 00 00 mov $0x1,%esi400565: bf 10 06 40 00 mov $0x400610,%edi40056a: b8 02 00 00 00 mov $0x2,%eax40056f: 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. 百科问答小站 版权所有