c语言编译过程和执行过程
c程序编译过程
预处理:宏定义展开(define)、头文件展开(系统的标准库展开)、条件编译(系统的是几位),同时将代码中的注释删除,这里不会检查语法
编译:检查语法,将预处理后文件编译成汇编文件(汇编语言)
汇编:将汇编文件生成目标文件(二进制文件)
链接:c语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的程序中去
一步编译
gcc -o hello.exe hello.c
分布编译
gcc-E hello.c -o hello.i
gcc-S hello.i -o hello.s
gcc-c hello.s -o hello.o
gcc hello.o -o hello.exe
#include<stdio.h>
//宏定义常量
#define MAX 100
int main(void)
{
printf("hello world\n");
printf("%d",MAX);
return 0;
}
常见代码错误:
1 编辑时异常(字符打错)
2 编译时异常(没有导入头文件)
3 运行时异常
程序执行过程
1 硬盘(外部储存设备)
1–>(加载)2
2–> (保存) 1
2 内存(MEM)
代码区 | 数据区 |
---|---|
栈区 | 堆区 |
2<–>(数据交互)3
3 中央处理器(CPU)
三大框架
运算器
控制器
寄存器
CPU内部结构与寄存器
64位和32位系统区别
寄存器是CPU内部最基本的储存单元
CPU对外是通过总线(地址、控制、数据)来和外部设备交互,总线的宽度是8位,同时CPU的寄存器也是8位,那么CPU就叫8位CPU
有一种CPU内部的寄存器是32位,但是总线是16位,准32位的CPU
所以的64位CPU兼容32位的指令,可以向下兼容
在64位的CPU架构上,运行32位的操作系统,那么这个系统就是32位的
寄存器名字
8位 A B C D
16位 AX BX CX DX
32位 EAX EBX ECX DDX
63位 RAX RBX RCX RDX
缓存
那为什么有缓存呢?因为如果经常操作内存中的同一地址的数据,就会影响速度,玉树就在寄存器与内存之间设置一个缓存
因为从缓存提取的速度远高于内存,当然缓存的价格肯定远远高于内存,不然的话,机器就没有内存了
CPU<---->寄存器<---->缓存<---->内存