- 6
- 0
- 约9.46千字
- 约 8页
- 2017-02-09 发布于重庆
- 举报
C语言printf函数深入分析
C语言printf()函数深入分析
?说 起编程语言,C语言大家再熟悉不过。说起最简单的代码,Helloworld更是众所周知。一条简单的printf语句便可以完成这个简单的功能,可是 printf背后到底做了什么事情呢?可能很多人不曾在意,也或许你比我还要好奇!那我们就聊聊printf背后的故事。
一、printf的代码在哪里?
显然,Helloworld的源代码需要经过编译器编译,操作系统的加载才能正确执行。而编译器包含预编译、编译、汇编和链接四个步骤。
#includestdio.h
int main()
{
??? printf(Hello World !\n);
??? return 0;
}
首先,预编译器处理源代码中的宏,比如#include。预编译结束后,我们发现printf函数的声明。
$/usr/lib/gcc/i686-linux-gnu/4.7/cc1 -E -quiet?main.c -o main.i
# 1 main.c
# 1 命令行
# 1 main.c
...
extern int printf (const char *__restrict __format, ...);
...
int main()
{
?printf(Hello World!\n);
?return 0;
}
$/usr/lib/gcc/i686-linux-gnu/4.7/cc1 -fpreprocessed -quiet?main.i -o main.s
??? .file????? main.c
??? .section?? .rodata
.LC0:
??? .string??? Hello World!
??? .text
??? .globl???? main
??? .type????? main, @function
main:
??? pushl????? %ebp
??? movl?????? %esp,? %ebp
??? andl?????? $-16,? %esp
??? subl?????? $16,?? %esp
??? movl?????? $.LC0, (%esp)
??? call?????? puts
??? movl?????? $0,??? %eax
??? leave
??? ret
??? .size????? main, .-main
...
我 们发现printf函数调用被转化为call puts指令,而不是call printf指令,这好像有点出乎意料。不过不用担心,这是编译器对printf的一种优化。实践证明,对于printf的参数如果是以\n结束的纯 字符串,printf会被优化为puts函数,而字符串的结尾\n符号被消除。除此之外,都会正常生成call printf指令。
如果我们仍希望通过printf调用Hello World !\n的话,只需要按照如下方式修改即可。不过这样做就不能在printf调用结束后立即看到打印字符串了,因为puts函数可以立即刷新输出缓冲区。我们仍然使用puts作为例子继续阐述。
??? .section?? .rodata
.LC0:
??? .string??? hello world!\n
??? ...
??? call?????? printf
...
接下来,汇编器开始工作。将汇编文件转化为我们不能直接阅读的二进制格式——可重定位目标文件,这里我们需要gcc工具包的objdump命令查看它的二进制信息。可是我们发现call puts指令里保存了无效的符号地址。
$as -o main.o main.s
$objdump –d main.o
main.o:???? 文件格式 elf32-i386
Disassembly of section .text:main:
?? 0:? 55?????????????????? ? push?? %ebp
?? 1:? 89 e5??????????????? ? mov??? %esp,%ebp
?? 3:? 83 e4 f0???????????? ? and??? $0xfffffff0,%esp
?? 6:? 83 ec 10???????????? ? sub??? $0x10,%esp
?? 9:? c7 04 24 00 00 00 00 ??? movl?? $0x0,(%esp)
? 10:? e8 fc ff ff ff?????? call?? 11 main+0x11
? 15:? b8 00 00 00 00?????? mov??? $0x0,%eax
? 1a:? c9?????????????????? ? leave?
?
您可能关注的文档
- CPU性能测试实验报告.doc
- Cpu型号大全及其参数.doc
- CPU的原理.doc
- CPU的工作原理浅析.doc
- CPU的性能.doc
- cpu调度实验报告.doc
- CPU过热故障分析与排除.doc
- cpvc和PPR的比较.doc
- CQI提升方案.doc
- Cqtpke浅谈中国新能源汽车.doc
- 2026年及未来5年内中国液体氩气行业投资前景及策略咨询研究报告.docx
- 2026年及未来5年内中国黄铜合页行业投资前景及策略咨询研究报告.docx
- 2026年及未来5年内中国竹工艺家具行业投资前景及策略咨询研究报告.docx
- 2025年中国微机数显自动分析仪市场调查研究报告.docx
- 2026年及未来5年内中国微尘白色粉笔行业投资前景及策略咨询研究报告.docx
- 2025年中国微电脑型压胶机市场调查研究报告.docx
- 2026年及未来5年内中国数字化等功游泳训练测试系统行业投资前景及策略咨询研究报告.docx
- 2025年中国圆形花瓶市场调查研究报告.docx
- 2026年及未来5年内中国植物纤维静淀过滤器行业投资前景及策略咨询研究报告.docx
- 2025年中国超音波手套机市场调查研究报告.docx
最近下载
- 档案录入员考试真题及答案.docx VIP
- 高考数学专题复习《排列组合二项式定理与概率统计》.pdf VIP
- 2025内蒙古地质矿产集团有限公司子公司招聘工作人员21人笔试备考试题及答案解析.docx VIP
- 2026年湖南有色金属职业技术学院单招职业技能考试备考试题有答案解析.docx VIP
- 2026年湖南有色金属职业技术学院单招综合素质笔试模拟试题及答案详解.docx VIP
- 内蒙古地质矿产集团有限公司招聘考试真题2024.pdf VIP
- 2026年湖南有色金属职业技术学院单招职业技能考试模拟试题附答案详解.docx VIP
- 2026年湖南有色金属职业技术学院单招综合素质考试模拟试题及答案详解.docx VIP
- 外科创伤课件.PPT VIP
- 2026年湖南有色金属职业技术学院单招综合素质考试备考试题及答案详解.docx VIP
原创力文档

文档评论(0)