17070709计算机组成/数码显示/gcc/gdb/make工程管理器/库文件

来源:互联网 发布:mac teamviewer 编辑:程序博客网 时间:2024/06/05 17:10

一、计算机组成原理
1.体系结构:冯·诺依曼体系结构
 五大部件:运算器、控制器、存储器、输入设备、输出设备
 CPU=运算器+控制器
 存储器=内存+外部存储器(多级存储体系,还有CPU内部缓存)
 工作原理:存储控制、程序控制
 计算机启动过程:上电瞬间,CPU复位(reset),所有寄存器恢复到初始状态,CPU从最高地址处,读取第一条指令,最高地址(以32位地址为例)是FF FF FF F0H~FF FF FF FFH(32位地址总线,共有32位二进制数。
其最小值是:0000…..0000(32个0);
其最大值是:1111…..1111(32个1))。
这里面实际上是一条跳转指令,跳转到主板上BIOS程序完成系统的自检,有错误则停止启动过程,没有问题则更新主板CMOS(系统配置信息),然后按照可引导设备的顺序,读取一个可引导设备的主引导记录MBR(0磁道0扇区),找到第一个active分区,读取分区引导记录,启动操作系统。
二、数据在计算机中的表示:原码反码补码、ASCII码
2.1.为什么要用补码
  CPU只支持加法和移位运算,补码可以解决减法运算问题补码解决
  减法运算原理:不需要判断操作数的绝对值大小,直接进行补码加
  法
  例:(3-5)补码=补码+(-5)补码
    (5-3)补码=5补码+(-3)补码
  补码定义(字长8位为例,最高位是符号位,0表示正,1表示负):
  正数:原码=补码
   例:127(十进制)转换为二进制111 1111,补码就是0111 1111
  负数:原码不等于补码,-128当特例记住
   例:-1(十进制)求该数的绝对值的二进制的值 转换为二进制
     000 0001,则原码为1000 0001
     -127(十进制)求该数的绝对值的二进制的值 转换为二进
     制111 1111,则原码为1111 1111
   特例:-128(十进制)求该数的绝对值的二进制的值 转换为二
   进制 1000 0000 则原码为1000 0000
  怎么求补码:把原码符号位除外取反加一
   例:-1 原码1000 0001 补码为1111 1111
     -127 原码1111 1111 补码为1000 0001
     -128 原码1000 0000 补码为1000 0000(原码补码相同)
  补码运算后怎样得到真值:符号位除外取反加一 A补码+B补码=C补码
   例:若C补码为1000 0000,符号位为1,是负数,真值等于符
     号位除外取反加一,为1000 0000十进制就是128,所以C
     补码的真值就是-128

三、gcc编译器使用
gcc使用格式
gcc 选项 生成文件 选项 源文件
1.标准模式:gcc - Wall -o 目标文件名 -g 源文件.c
选项:-Wall 显示所有警告信息
-o 输出目标文件
-g 用于调试,生成调试信息,若要用gdb进行程序调
试,编译时必须加-g
2.gcc -o 目标文件名 -g 源文件.c
3.gcc 源文件.c -o 目标文件名
四、gdb调试工具
gdb是GNU发布的一款功能强大的程序调试工具,功能非常强大的程序调试器,弥补了gcc调试效率低的特点。
功能:1. 启动被调试程序
2. 让被调试程序在指定位置停住
3. 当程序停住时可以检查程序变量值
前提:gcc编译选项一定要有 -g
调试方法: gdb 待调试的程序名字
调试指令:list 缩写l :显示程序查看代码,如果没有显示完可以继续list
breakpoint 缩写b :设置程序断点,方法 b 行号
info b :查看断点信息
delete +断点编号:删除断点
run 缩写r :执行程序,遇到断点停止
continue 缩写c :继续运行,但遇到断点会停下
print 缩写p :查看变量 方法是 p 变量
next 缩写n :单步执行,不进入函数内部
step 缩写s :单步执行,进入函数内部
until 缩写u :在循环中直接运行到循环结束
bt 查看堆栈
quit 缩写q :退出gdb
五、Make工程管理器
1.工程:多个源文件组成的程序,比如很多个.c文件
2.gcc *.c 编译所有c,麻烦又影响效率
make就是编译很多源文件
make优点:1. 使用方便,2. 调试效率高
文件变了才检查和编译,不变就不编译
Make为什么被称为全自动化的编译器?
1)、按规则编译使用方便:通过命令”make”即可启动编译,Make工程管理器就根据规则文件Makefile来编译
2)、按时间戳编译调试效率高:Make会自动检查每个源文件的时间戳的时间,如果发现时间更新就编译该文件,如
果时间戳没变就不再编译该文件
3. makefile 规定make如何编译源文件
touch makefile创建
写makefile:makefile就是脚本文件,写的是脚本语言shell(.sh)或者python(.pl)
脚本:实现批处理
4. Makefile组成部分:
目标文件:依赖文件
编译规则命令行
Makefile规定在书写command命令行前必须加一个键

hello: hello.o
(目标 依赖)
gcc hello.o -o hello
(按TAB 命令)
hello.o: hello.c
(目标 依赖)
gcc -c hello.c
(TAB )
gcc -c hello.c
从上往下执行,效果从下往上
5.自动编译
按照写的makefile编译,自动检查是否修改过
6.为什么要把.c变成.o:类似于饭店点菜,先做成半成品,提高效率
7.三类Makefile:
总控Makefile:进入各个功能子目录里执行make命令,将所有.o文件链接生成最终可执行文件
功能子目录Makefile: 将src目录下.c文件编译成.o文件
scripts目录的Makefile:定义许多变量(相当于C语言的头文件)
8.mkdir -p sub/src 在sub下创建src(先创sub,再创src)
tree树状显示子目录结构
9.实例:编写程序模拟一个实现加减乘除功能的计算器并用Make工程管理器实现多个源文件的调试
按照如下树形图建立目录
tree型目录
|– Makefile
|– add
| |– Makefile
| -- src
| |-- add.c
|-- client
|-- div
| |-- Makefile
|
– src
| |– div.c
|– mul
| |– Makefile
| -- src
| |-- mul.c
|-- scripts
|
–Makefile
|– sub
| |– Makefile
| -- src
| |-- sub.c
– test
|– Makefile
`– src
|– main.c

add.c程序
这里写图片描述

sub.c程序
这里写图片描述

mul.c程序
这里写图片描述

div.c程序
这里写图片描述

main.c程序
这里写图片描述

建立Makefile文件:touch Makefile, 编写程序,给Makefile加上可执行权限,如图
这里写图片描述
scripts /Makefile(在脚本功能目录下的Makefile主要进行一些 变量赋值,在编写时编者需要了解基本的赋值语句,在这里以#开头均为注解)
这里写图片描述

总控Makefile (在总控Makefile中主要执行进入各个子目录中读取Makefile并进行make编译的嵌套功能)
这里写图片描述

功能块Makefile (在各个独立的子功能块编写Makefile文件)
这里写图片描述

六、库的使用
为了有效降低编程的工作量,编程系统会把一些非常基本的、常用的函数集中到函数库中实现。当程序需要使用到函数库中的某个函数时,就可以直接从库中调用。

函数库的使用方式分为静态链接和动态链接两种。
静态链接是指编译系统在链接阶段把程序的目标文件和所需的函数 库文件链接在一起,这样生成的可执行文件就可以在没有函数库的情况下运行。
动态链接是指编译系统在链接阶段并不把目标文件和函数库文件链接在一起,而是等到程序在运行过程中需要使用时才链接函数库。
优缺点:使用静态链接方式产生的可执行文件体积较大,但运行效率高。
使用动态链接产生的可执行文件由于没有库文件,所以体积较小,但由于需要动态加载函数库,所以运行效率要低
  具体应用时,如果有多个源文件都需要调用函数库,应该选择动态链的方式。如果只有少数源文件需要调用函数库,应该选择静态链接。
   范例:创静态库:#gcc -c add.c
          #ar rcs libadd.a add.o(把add.o封装到库)
          #gcc main.c -ladd -L/root/0706/
     -l用于链接库 -L指定链接到头文件的搜索路径
     创动态库:#gcc -shared -fPIC add.c -o libadd.so
      #gcc main.c /root/0706/libadd.so -o add