以Linux下hello.c为例
//hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
}
编译系统
- 预处理(preprocess)阶段:cpp把.h头文件直接插入程序文本,得到hello.i文件,并且移除注释(comments)
- 编译(compile)阶段:ccl把hello.i翻译成hello.s,其中包含汇编程序
- 汇编(assemble)阶段:as把hello.s翻译成机器指令打包成目标文件hello.o
- 链接(link)阶段:ld把需要的外部函数所在.o文件合并进当前hello.o,得到可执行文件,能加载到内存
中间文件顺序:ciso
程序执行
在linux下完成编译后用户输入./hello可执行程序,实际上有下列三步
- 接收用户输入: 从键盘接收输入后shell程序把字符读入寄存器,再放入主存,当敲下回车,shell判断输入完毕,执行指令加载可执行文件hello
- 加载hello到主存: Shell指令把磁盘中的hello复制到主存,其中包含要输出的”hello,world\n”
- 输入至显示器:当程序加载到主存后,CPU开始执行机器指令,将”hello,world\n”对应字节复制到寄存器,再从寄存器输出至显示器
选择题知识点
- VC++Project中包含Files
- VC++中win32 console程序是:VC++可生成的最简单程序
- 计算的抽象级别排序: C++ code > C code
机器码 > 逻辑门
以下代码
unsigned int x; int y;
cin >> x >> y;
cout << x + y;
当x,y都是正数,打印结果不一定为正数,unsigned int和int运算无显式说明时进行无符号加法,得到无符号数
举例:
令x=1,y=-4,此时执行无符号加法,结果fffffffd全被当作数据位,得到4294967293
当x定义为int时
此时执行补码加法,结果fffffffd的补码00000003,符号位f,答案-3IDE使得很难混合和匹配来自不同来源的工具:不好,因为没有一个供应商可能是所有最好工具源
- C代码和机器码可以描述相同的算法
- 关于debugger(调试程序)
作用:①编译compiler生成的机器指令②中断程序的执行,但debugger本身不能发现error
使用:可能需要重复执行多次代码才能定位错误behavior