1、C 语言概述

1. c语言编译

1. gcc编译器

gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
选项含义
-o file指定生成的输出文件名为file
-E只进行预处理
-S只进行预处理和编译
-c只进行预处理、编译和汇编

2. 代码分析

  1. include 头文件包含

    #include< > 与 #include ""的区别:

    • < > 表示系统直接按系统指定的目录检索

    • 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

  2. main 函数

    有且只有一个,必须有,C语言程序

  3. {} 括号,程序体和代码块

    • {}叫代码块,一个代码块内部可以有一条或者多条语句

    • C语言每句可执行代码都是 “;” 分号结尾

    • 所有的 # 开头的行,都代表预编译指令,预编译指令行结尾是没有分号的

    • 所有的可执行语句必须是在代码块里面

  4. 注释

    • // 叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读

    • /**/ 叫块注释

    • 块注释是C语言标准的注释方法

    • 行注释是从C++语言借鉴过来的

  5. return 语句

    • return 代表函数执行完毕,返回 return 代表函数的终止

    • 如果 main 定义的时候前面是 int,那么 return 后面就需要写一个整数;如果 main 定义的时候前面是 void,那么 return 后面什么也不需要写

    • 在 main 函数中 return 0 代表程序执行成功,return -1 代表程序执行失败

    • int main() 和 void main() 在C语言中是一样的,但 C++ 只接受 int main 这种定义方式

3. system 函数

  1. 作用

    #include <stdlib.h>

    int system(const char *command);

    功能:在已经运行的程序中执行另外一个外部程序

    参数:外部可执行程序名字

    返回值:

    ​ 成功:0

    ​ 失败:任意数字

4. C 语言编译过程

  1. 编译步骤

    1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

    2)编译:检查语法,将预处理后文件编译生成汇编文件

    3)汇编:将汇编文件生成目标文件(二进制文件)

    4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

在这里插入图片描述

  1. gcc 编译过程

    1. 分步编译

      预处理: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

      文件后缀含义
      .cC 语言文件
      .i预处理后的 C 语言文件
      .s编译后的汇编文件
      .o编译后的目标文件
    2. 一步编译

      gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程)

  2. 查找程序所依赖的动态库

    Windows平台下,需要相应软件(Depends.exe)

5. CPU内部结构与寄存器

  1. 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 之上

  2. 寄存器名字

    8位16位32位64位
    AAXEAXRAX
    BBXEBXRBX
    CCXECXRCX
    DDXEDXRDX
  3. 寄存器、缓存、内存三者关系

    按与CPU远近来分,离得最近的是寄存器,然后缓存( CPU 缓存),最后内存。

    CPU 计算时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。于是 CPU <—> 寄存器 <—> 内存,这就是它们之间的信息交换。

6. 汇编语言

  1. 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;//成功完成
    }
    
    
  2. VS反汇编

    1. 设置断点F9
    2. 选择反汇编按钮(调试 -> 窗口 -> 反汇编)
    3. 根据汇编代码分析程序

7. 集成开发环境IDE

  1. C4996错误

    #define _CRT_SECURE_NO_WARNINGS     //这个宏定义最好要放到.c文件的第一行
    #pragma warning(disable:4996)	//或者使用这个
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值