语言发展史
- 机器语言 机器直接执行的指令,全部为01数字
- 汇编语言 固定的语法和语句,晦涩难懂
- C语言(高级语言),语法简洁,易读懂
Hello World
#include<stdio.h>
int main(){
printf("hello world\n");
}
以上,就是一个最简单的C语言HelloWorld程序。从第一行说起
导入头文件
#include<stdio.h>
此行代码表示导入一个文件stdio.h,,std是一个标准库,io表示输入输出,h表示头文件
#include<stdlib.h>
导入一个lib头文件,导入之后,可以直接调用系统函数,如system(),
system函数可以打开一个外部的应用程序,如果带路径,需要使用\\或者/
返回值:成功为0 失败为任意数字
int value = system("D:/Desktop/FeiQ.exe");
system("pause");//表示程序运行到这里会暂停
<>尖括号表示导入的是系统头文件,“”双引号表示导入的是自定义的头文件
关于编译
写完代码需要编译才能成为可执行程序,才能被执行,下面介绍两种编译方式:
一步编译和分步编译
一步编译:
gcc -o 文件路径+文件名称.exe 文件路径+文件名称.c
gcc -o 可执行文件名称.exe 源代码文件名称.c(如果有多个源代码文件,空格后面继续加源代码文件)
(没有gcc的需要先安装gcc)
分步编译:
1、预处理 宏定义展开 头文件展开 条件编译 去掉注释 这里不会检查语法 gcc -E hello.c -o hello.i 生成一个hello.i文件
2、编译 检查语法 将C语言转成汇编语言 gcc -S hello.i -o hello.s 生成一个hello.s文件
3、汇编 将汇编语言转成机器语言(二进制码) gcc -c hello.s -o hello.o 生成一个hello.o文件
4、链接 将C语言依赖库连接到程序中 gcc hello.o -o hello.exe
程序执行过程
程序不启动的时候,存放在硬盘中,启动的时候,将exe文件加载到内存中,内存分为4个部分,代码区,数据区,栈区,堆区
在对程序进行操作的时候,内存区会将数据交给CPU进行运算,CPU分为三个部分,运算器,控制器,寄存器,最后程序如果退出了,程序会继续存放在硬盘中。
内存和CPU之间的数据交互是通过总线完成的。
CPU与寄存器
寄存器是CPU内部最基本的存储单元
CPU对外是通过总线(地址,控制,数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那么这是一个8位CPU
如果总线是32位的,寄存器也是32位的,那么这个CPU就叫做32位CPU
有一种CPU内部寄存器是32位,但是总线是16位,称为准32位CPU
所有的64位CPU兼容32位指令,32位兼容16位的指令,
在64位的CPU架构上运行了64位的软件操作系统,那么这个系统是64位
在64位的CPU架构上运行了32位的软件操作系统,那么这个系统是32位
64位的软件不能运行在32位的CPU上
寄存器名称
8位 16位 32位 64位
A AX EAX RAX
B BX EBX RBX
C CX ECX RCX
D DX EDX RDX
寄存器 缓存和内存之间的关系
按CPU远近来分,离得最近的是寄存器,然后是CPU缓存 最后是内存
CPU计算时,要预先把要用的数据从硬盘读取到内存,然后再把即将要用的数据读到寄存器,CPU<–>寄存器<–>内存
那为什么会有缓存呢?因为如果经常性的操作内存中同一地址的数据,就会影响速度,于是就在寄存器与内存之间,设置一个缓存
因为缓存提取的速度远高于内存,当然缓存的价格就远高于内存
由此可以看出,从远近来看 CPU<–>寄存器<–>缓存<–>内存
注意:电脑一关机,寄存器和内存的东西全部清零,只剩下硬盘的东西可以保存
汇编语言
C语言加法代码: int a = 10;
int b = 20;
int c = a+b;
汇编语言加法: __asm
{
mov a, 10 //将10的值放在a对应内存的位置
mov b, 20 //将20的值放在b对应内存的位置
mov eax, a //将a内存的值,放进eax寄存器
add eax, b //eax和b相加,结果放在eax
mov c, eax //eax的值放在c中
}
在汇编语言中:
mov 移动
add 添加
push 压栈
pop 出栈
call 调用