1. c语言编译
1. gcc编译器
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
选项 | 含义 |
---|---|
-o file | 指定生成的输出文件名为file |
-E | 只进行预处理 |
-S | 只进行预处理和编译 |
-c | 只进行预处理、编译和汇编 |
2. 代码分析
-
include 头文件包含
#include< > 与 #include ""的区别:
-
< > 表示系统直接按系统指定的目录检索
-
表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
-
-
main 函数
有且只有一个,必须有,C语言程序
-
{} 括号,程序体和代码块
-
{}叫代码块,一个代码块内部可以有一条或者多条语句
-
C语言每句可执行代码都是 “;” 分号结尾
-
所有的 # 开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
-
所有的可执行语句必须是在代码块里面
-
-
注释
-
// 叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
-
/**/ 叫块注释
-
块注释是C语言标准的注释方法
-
行注释是从C++语言借鉴过来的
-
-
return 语句
-
return 代表函数执行完毕,返回 return 代表函数的终止
-
如果 main 定义的时候前面是 int,那么 return 后面就需要写一个整数;如果 main 定义的时候前面是 void,那么 return 后面什么也不需要写
-
在 main 函数中 return 0 代表程序执行成功,return -1 代表程序执行失败
-
int main() 和 void main() 在C语言中是一样的,但 C++ 只接受 int main 这种定义方式
-
3. system 函数
-
作用
#include <stdlib.h>
int system(const char *command);
功能:在已经运行的程序中执行另外一个外部程序
参数:外部可执行程序名字
返回值:
成功:0
失败:任意数字
4. C 语言编译过程
-
编译步骤
1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
2)编译:检查语法,将预处理后文件编译生成汇编文件
3)汇编:将汇编文件生成目标文件(二进制文件)
4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
-
gcc 编译过程
-
分步编译
预处理: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
文件后缀 含义 .c C 语言文件 .i 预处理后的 C 语言文件 .s 编译后的汇编文件 .o 编译后的目标文件 -
一步编译
gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程)
-
-
查找程序所依赖的动态库
Windows平台下,需要相应软件(Depends.exe)
5. CPU内部结构与寄存器
-
64位和32位系统区别
-
寄存器是 CPU 内部最基本的存储单元
-
CPU 对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时 CPU 的寄存器也是8位,那么这个 CPU 就叫8位 CPU
-
如果总线是32位,寄存器也是32位的,那么这个CPU就是32位 CPU
-
有一种 CPU 内部的寄存器是32位的,但总线是16位,为准32位 CPU
-
所有的64位 CPU 兼容32位的指令,32位兼容16位的指令,所以在64位的 CPU 上是可以识别32位的指令
-
在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 <—> 寄存器 <—> 内存,这就是它们之间的信息交换。
6. 汇编语言
-
VS中C语言嵌套汇编代码
#include <stdio.h> int main() { //定义整型变量a, b, c int a; int b; int c; __asm { mov a, 3 //3的值放在a对应内存的位置 mov b, 4 //4的值放在b对应内存的位置 mov eax, a //把a内存的值放在eax寄存器 add eax, b //eax和b相加,结果放在eax mov c, eax //eax的值放在c中 } printf("%d\n", c);//把c的值输出 return 0;//成功完成 }
-
VS反汇编
- 设置断点F9
- 选择反汇编按钮(调试 -> 窗口 -> 反汇编)
- 根据汇编代码分析程序
7. 集成开发环境IDE
-
C4996错误
#define _CRT_SECURE_NO_WARNINGS //这个宏定义最好要放到.c文件的第一行 #pragma warning(disable:4996) //或者使用这个