期中总结:
第一章 计算机系统漫游
1.1 Linux基础
1.Linux命令
command [options] [arguments]
//中括号代表是可选的,即有些命令不需要选项也不需要参数 选项(options)或参数(arguments)
选项是调整命令执行行为的开关,选项不同决定了命令的显示结果不同。
参数是指命令的作用对象。
2. man命令
man是manul的缩写 帮助文档
3.cheat 命令
cheat命令是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。
它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
4.其他核心命令
find查找一个文件在系统中的什么位置,locate是神速版本的find
grep 可以对文件全文检索,支持正则表达式,
whereis,which告诉你使用的命令工具装在什么地方。
1.2 Linux下C语言编程基础
1.VIM是文本编辑器
2.大写“K”可以用来查找函数的帮助信息:
查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。
3.几个设置:
:set nu 显示行号
:set ai 自动缩行
:set ts=4 设置一个 TAB 键等于几个空格
4.移动光标:
[[ 转到上一个位于第一列的"{"
]] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
5.GCC:
(1)预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
(2)编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
(3)汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
(4)链 接:gcc hello.o –o hello ;gcc -o 调用ld
1.3 Vim模式:
普通模式
插入模式
可视模式
选择模式
命令行模式
Ex模式
vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通 模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车 后保存并退出vim。
1.普通模式:
按键 | 说明 |
h | 左 |
l | 右(小写L) |
j | 下 |
k | 上 |
w | 移动到下一个单词 |
b | 移动到上一个单词 |
2.插入模式:
命令 | 说明 |
i | 在当前光标处进行编辑 |
I | 在行首插入 |
A | 在行末插入 |
a | 在光标后插入编辑 |
o | 在当前行后插入一个新行 |
O | 在当前行前插入一个新行 |
3.退出vim:
(1).命令行模式下退出vim:
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
以下为其它几种退出方式:
命令 | 说明 |
:q! | 强制退出,不保存 |
:q | 退出 |
:wq! | 强制保存并退出 |
:w <文件路径> | 另存为 |
:saveas 文件路径 | 另存为 |
:x | 保存并退出 |
:wq | 保存并退出 |
(2)普通模式下退出vim:
普通模式下输入Shift+zz即可保存退出vim
4.删除文本:
进入普通模式,使用下列命令可以进行文本快速删除:
x :删除游标所在的字符
X: 删除游标所在前一个字符
Delete:同x
dd:删除整行
dw:删除一个单词(不适用中文)
d$或D:删除至行尾
d^:删除至行首
dG:删除到文档结尾处
d1G:删至文档首部
注:在命令之前加上数字,表示一次删除多行
1.4总结:
1.计算机系统由硬件和软件系统组成
2.程序被其他程序翻译成不同的形式,开始时ASCII文本,然后被编译器和链接器翻译成二进制可执行文件
3.系统中的存储设备划分为层次结构:CPU存储器在顶部,接着是多层的硬件高速缓存存储器,DRAM主存和磁盘存储器
4.操作系统内核是应用程序和硬件之间的媒介。它提供三个基本抽象:
(1)文件是对I/O设备的抽象
(2)虚拟存储器是对主存和磁盘的抽象
(3)进程是对处理器,主存和I/O设备的抽象
5.链接可以在编译时由静态编译器完成,也可由在加载时和运行时由动态链接器完成。
6.链接器处理称为目标文件的二进制文件,其有三种不同形式:(1)可重定位的(2)可执行的(3)共享的
7.链接器主要任务:(1)符号解析(2)重定位
符号解析:将目标文件中的每个全局符号都绑定到一个唯一的定义
重定位:确定每个符号的最终存储器地址,并修改对那些目标的应用
8.静态链接器由GCC类似编译取驱动器调用,他们将多个可重目标文件合并成一个单独的可执行目标文件
9.多个目标文件可以被连接到一个单的的静态库中。链接器用库来解析其他目标模块中的符号引用
10.加载器可将可执行文件的内容映射到存储器,并运行这个程序。链接器还能生成部分连接的可执行目标文件,这样的文件中有对定义在共享库中的程序和数据和数据的未解析的引用。
第二章:信息表示和处理
总结:
1.计算机将信息按位编码,通常组成字节序列。用不同的编码方式表示整数,师叔和字符串。不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。
2. C语言的设计可以包容多种不同字长和数字编码的实现,目前大多数机器使用32位字长。大多数机器对整数使用补码编码,而对浮点数使用IEEE浮点编码。
3.在相同长度的无符号和有符号整数之间进行强制转换时,大多数C语言实现循环的原则是底层的位模式不变。在补码机器上,对于一个w位的值。这种行为是由函数T2Uw和U2Tw来描述的。C语言隐式的强制类型转换会出现许多程序员无法预计的结果,常常导致程序错误。
4.由于编码长度有限,与传统的整数和实数运算相比,计算机运算具有完全不同的属性。当超出表示范围,有限长度能够引起数值溢出。当浮点数非常接近于0.0.从而转换成零时,也会下溢。
5.浮点表示用过将数字编码为x乘以2的y次方的形式近似地表示实数。最常见的浮点表示方式是由IEEE标准754定义的。它提供了几种不同的精度,最常见的是单精度(32位)和双精度(64位)。IEEE浮点也能够表示特殊值,如负无穷,正无穷和NaN。
6.必须对浮点运算小心的使用,因为浮点运算只有有限的范围和精度,而且不遵守普遍的算数属性,例如结合性 来描述的。
7.信息存储:
机器及程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都由一个唯一的数字来标识,称它为地 址,所有可能地址的集合称为虚拟地址空间。
8.寻址和字节顺序:
(1)大端法(2)小端法
布尔代数:
与& 或| 非~ 异或^
9.C语言的逻辑运算:
&& || ~ 注意与布尔代数的区别
10.C语言中的位移运算
<<左移
>>右移(注意区别逻辑右移和算术右移)
11.重要公式:
(1)补码编码
(2)有符号和无符号数之间的转换
(3)截断数字
(4)无符号数加法
(5)补码加法
(6)补码的非
(7)补码乘法
(8)IEEE浮点表示
第三章 程序的机器级表示
3.1 历史观点:
intel处理器系列俗称x86,经历了一开始个长期的,不断进化的发展过程。
开始时它是第一代单芯片,16位微处理器之一,由于当时集成电路技术水性有限,其中做了很多妥协,此后,他不断成长,利用进步的技术满足更高性能和支持高级操作系统的需求。
3.3数据格式:
数据传送指令:movb(传送字节) movw(传送字) movl(传送双字)
3.4访问信息:
一个IA32 CPU 包含一组8个存处位值的寄存器。这些寄存器用来存处整数数据和指数
3.4.1操作数指示符:
大多数指令有一个或多个操作数,指示出执行一个操作中
(1)立即数 常数值
(2)寄存器 表示某个寄存器的内容
(3)存储器 根据计算出来的有效地址,访问某个存储器位置
例:
类型 | 格式 | 操作数值 | 名称 |
立即数 | $Imm | Imm | 立即数寻址 |
寄存器 | Ea | R[Ea] | 寄存器寻址 |
存储器 | Imm | M[Imm] | 绝对寻址 |
存储器 | (Ea) | M[R[Ea]] | 间接寻址 |
存储器 | Imm(Eb) | M[Imm+R[Eb]] | (基址+偏移量)寻址 |
3.4.2数据传送指令
MOV S,D | D←S | 传送 |
movb movw movl | 传送字节 传送字 传送双字 |
|
MOVS S,D | D←符号扩展(S) | 传送符号扩展的字节 |
movsbw movswl movswl | 将做了符号扩展的字节传送到字 将做了符号扩展的字节传送到双字 将做了符号扩展的字传送到双字 |
|
MOVz S,D | D←零扩展(S) | 传送零扩展的字节 |
movzbw movzbl movzwl | 将做了零扩展的字节传送到字 将做了零扩展的字节传送到双字 将做了零扩展的字传送到双字 |
|
“栈”遵循“后进先出”原则
push 把数据压入栈 pop 删除数据
3.5算数和逻辑操作
3.5.1加载有效地址
加载有效地址指令leal实际上是movl指令的变形,它的指令形式是从存储器读取寄存器,但实际上没有引用存储器
指令 | 效果 | 描述 |
leal S,D | D←&S | 加载有效地址 |
INC D | D←D+1 | 加一 |
ADD S,D | D←D+S | 加 |
SAL k,D | D←D<<k | 左移 |
3.5.5特殊的算术操作
指令 | 效果 | 描述 |
imull S | R[%edx]:R[%eax]←S×R[%eax] | 有符号全64位乘法 |
cltd | R[%edx]:R[%eax]←SignExtend(R[%eax]) | 转为四字 |
idivl S | R[%edx]←R[%edx]:R[%eax]modS | 有符号除法 |
| R[%edx]←R[%edx]:R[%eax]÷S |
|
divl | R[%edx]←R[%edx]:R[%eax]÷S | 无符号除法 |
3.6控制
3.6.1条件码
CF:进位标志 最近的操作使最高位产生了进位,可以用来检查无符号操作的溢出
ZF:零标志 最近的操作得出的结果为0
SF:符号标志 最近的操作得到的结果为负
OF:溢出标志 正溢出,负溢出
3.6.2访问条件码
指令 | 同义名 | 效果 | 设置条件 |
sete D sets D setg D | setz
setnle | D←ZF D←SF D←~(SF^OF)&~ZF | 相等/零 负数 大于(有符号>) |
3.6.3跳转指令及其编码
跳转指令会导致执行切换到程序中一个全新的位置
3.6.4翻译条件分支
将条件表达式和语句从C语言翻译成机器代码,最常用的方式是结合有条件和无条件跳转
3.6.5循环
汇编中没有相应的指令从在,可以用条件测试和跳转组合起来实现循环效果。
do—while循环
while循环
for循环
3.6.6条件传送指令
实现条件操作的传统方法是利用控制的条件转移,当条件满足时,程序沿着一条执行路径进行,而当条件不满足时,就走另一条路径,这种机制简单而通用,但在现代处理器上,他可能会非常的低效率
数据的条件转移是一种代替的策略。这种方法先计算一个条件操作的两种结果,然后再根据条件是否满足从而选取一个。只有在一些受限制的情况下,这种策略才可行,但如果可行,就可以用一条简单的条件传送指令来实现它。条件床送指令跟好的匹配了现代处理器的性能特性
3.7过程
3.7.1栈帧结构
IA32程序用程序栈来支持过程调用。机器用来栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。
3.7.2转移控制
指令 | 描述 |
call Label call *Operand leave ret | 过程调用 过程调用 为返回准备栈 从过程调用中返回 |
3.7.3寄存器使用惯例
程序寄存器组唯一能被所有过程共享的资源
虽然在给定时刻只能有一个过程是活动的,但是我们必须保证当一个过程(调用者)调用另一个过程(被调用者)是,被调用着不会覆盖某个调用者稍后会使用的寄存器的值,为此IA32采用了一组统一的寄存器使用惯例,所有的过程都必须遵守,包括程序库中的过程。
3.8总结:
1.在本章中,认识并了解到了C语言抽象层下面的东西,以了解机器级编程。通过让编译器产生机器级程序的汇编显示,了解了编译器和他的优化能力,以及机器,数据类型和指令集。
2.机器级程汇序和他们的,与C语言的差别很大。在汇编语言程序中,各种数据类型之间的差别很小。程序是以指令序列来表示的,每条指令都完成一个单独的操作。部分程序状态,如寄存器和运行时栈,对程序员来说都是可见的。
第四章 处理器体系结构
4.1 Y86指令集体系结构
4.1.1程序员可见状态
Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。
4.1.2 Y86指令
4个指令:irmovl,rrmovl,mrmovl,rmmovl,分别显示地指明源和目的的格式
4个整数操作指令:addl,subl,andl,xorl
7个跳转码指令jmp,jle,jl,jne,jge,jg
6个条件传送指令cmovle,cmovl,cmove,cmovge,cmovg
call指令将返回地址入栈,然后跳到目的地址
pushl和popl指令实现了入栈和出栈
halt指令停止指令的执行
4.1.3 指令编码
指令集重要性质:字节编码必须有唯一的解释 即任意一个字节序列要么是一个唯一的指令序列的代码
分支指令和调用指令的目的地址是一个绝对地址
4.1.4 Y86异常
值 | 名字 | 含义 |
1 2 3 4 | AOK HLK ADR INS | 正常操作 处理器执行halt指令 遇到非法地址 遇到非法指令 |
4.2逻辑设计和印鉴控制语言HCL
4.2.1逻辑门
AND,OR,NOT
&&,||,!
4.2.2组合电路和HCL布尔表达式
将很多的逻辑门组合成一个网,就能构成计算块,称为组合电路
多路复用器:根据输入控制型号的值,从一组不同的数值信号中选出一个
4.2.5存储器和时钟
时钟寄存器
随机访问存储器
4.3 Y86的顺序实现
4.3.1将处理组织成阶段:
取指
译码
执行
访存
写回
更新PC
4.3.2 SEQ硬件结构
取指
译码
执行
访存
写回
4.4总结:
1.ISA,即指令集结构,在处理器行为和如何实现处理器之间提供了一层抽象。提供了程序执行的一种顺序说明,即一条指令执行完了,下一条指令才会开始
2.流水线化通过让不同的阶段并行操作,改进了系统的吞吐量功能。在任意一个给定的时刻,多条指令被不同的阶段来处理。
3.处理器设计的重要经验:
(1) 管理复杂性问题是首要问题,想要优化使用硬件资源,在最小的成本下获得最大的性能
(2) 不需要直接实现ISA
(3) 硬件设计需要小心谨慎,因为芯片设计出就无法改了
第六章 存储器层次结构
存储器系统是一个具有不同容量,成本和访问时间的存储设备的层次结构。
CPU寄存器保存着最常用的数据。
靠近CPU的小的,快速的高速缓存存储器作为一部分存储在相对较慢的主存储器(主存)中的数据和指令的缓存区域。
主存暂时存放存储在容量较大的,慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓存区域。
6.1存储技术
6.1.1随机访问存储器
随机访问存储器(RAM)分为:静态的RAM(SRAM)和动态的RAM(DRAM)
SRAM用来作为高速缓存存储器,既可以在CPU芯片上,也可以在片下。
DRAM用来作为主存以及图形系统的帧缓冲区。
1.静态RAM
SRAM将每个位存储在一个双稳态的存储器单元里
也就是说,只要有电,它就会永远地保持它的值。即使有干扰
2.动态RAM
DRAM将每个位存储为对一个电容充电
DRAM存储器单元对干扰非常敏感,当电容的电压被扰乱后,它就永远不会再恢复了
3.传统的DRAM
DRAM芯片中的单元(位)被分成d个超单元,每个超单元都由w个DRAM单元组成。一个d×w的DRAM总共存储了dw位信息。超单元被组织成一个r行c列的长方形阵列,这里rc=d。每个超单元都有形如(i,j)的地址,i表示行,j表示列。
4.存储器模块
DRAM芯片包装在存储器模块中,它是查到主板的扩展槽中。常见的包装包括168个引脚的双列直插存储器模块,它以64位为块传送数据到存储控制器和从存储控制器传出的数据,还包括72个引脚的单列直插存储器模块,它以32位为块传送数据。
5.增强的DRAM
对DRAM的改进:
(1)快页模式DRAM
(2)扩展数据输出DRAM
(3)同步DRAM
(4)双倍数据速率同步DRAM
(5)RambusDRAM(RDRAM)
(6)视屏DRAM
6.非易失性存储器
若断点,DRAM和SRAM会丢失信息,即易失的。
相反的,断电后仍保存信息,则为非易失的存储器。
7.访问主存
数据流通过称为总线的共享电子电路在处理和DRAM主存之间来来回回。
每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事物。
读事物从主存传送数据到CPU。
写事物从CPU传送数据到主存。
6.1.2磁盘存储
1.磁盘构造
(1)磁盘由盘面构成,每个盘面有两面或者称为表面,表面覆盖记录材料。
盘片中央有一个可以旋转的主轴,使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟。
(2)每个表面是由一组成为磁道的同心圆组成的。每个磁道被划分为一组扇区。
每个扇区包含相等数量的数据位,这些数据编码在扇区上的磁性材料中。
扇区之间由一些间隙分隔开,这些间隙中不存储数据位。间隙存储用来标识山区的格式化位
(3)磁盘是由一个或多个叠放在一起的盘片组成的,他们被分装在一个密封的包装里。
整个装置通常称为磁盘驱动器,简称磁盘。
柱面:所有盘片表面上到主轴中心的距离相等的磁道的集合。
2.磁盘容量
记录密度:磁道每一英寸的段中可以放入的位数
磁道密度:从盘片中心出发半径以上一英寸的段内可以有的磁道数
面密度:记录密度与磁道密度的乘积
磁盘容量:(字节数/扇区)×(平均扇区/磁道)×(磁道数/表面)×(表面数/盘片)×(盘片数/磁盘)
3.磁盘操作
磁盘用读/写头来读写存储在磁性表面上的位,而读写头连接到一个传动臂一端。
通过沿着半径轴前后移动这个传动臂,驱动器就可以将读/写头定位在盘面上的任何磁道上,这个机械运动称为寻道。
对扇区访问时间分为三部分:
(1)寻道时间:
(2)旋转时间:
Tmax rotation = (1/RPM) × (60secs/1min)
平均旋转时间Tavg rotation是 Tmax rotation一半
(3)传送时间:
Tavg transfer =(1/RPM) × (1/(平均扇区数/磁道)) ×(60secs/1min)
4.逻辑磁盘块
为了对操作系统隐藏复杂性,现代磁盘将它们的构造呈现为一个简单的视图,一个B个扇区大小的逻辑块的序列,编号为0,1,…,B-1。
磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际(物理)磁盘扇区之间的映射关系。
5.连接到I/O设备
有三种不同类型的设备连接到总线:
(1)通用串行总线
(2)图形卡
(3)主机总线适配器
6.1.3固态磁盘
固定硬盘是基于闪存的存储技术,在某些情况下是传统旋转磁盘的极有吸引力的替代产品。
6.1.4存储技术趋势
不同的存储技术有不同的价格和性能折中
不同存储技术的价格和性能属性以截然不同的速率变化着
DRAM和磁盘的性能滞后于CPU的性能
6.2局部性
局部性原理:倾向于引用临近与其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
局部性:(1)时间局部性 (2)空间局部性
在硬件层,局部性原理允许计算机设计者通过引用称为高速缓存存储器的小而快速的存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度
在操作系统级,局部性原理允许系统使用主存作为虚拟地址空间最近被引用的高速缓存。
6.2.1对程序数据引用的局部性
我们称为步长为1的引用模式为顺序引用模式。
一个连续向量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
6.2.2取指令的局部性
因为程序指令是存放在存储器中的,CPU必须取出(读出)这些指令,所以我们也能够评价一个程序关于取指令的局部性。
6.3存储器的层次结构
6.3.1存储器层次结构中的缓存
1.缓存命中
当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d。如果d刚好缓存在第k层中,那么就是缓存命中。
该程序直接从第k层读取d,根据存储器层次结构的性质,这要比从第k+1层读取d更快。
2.缓存不命中
如果第k层中没有缓存数据对象d,那么就是我们所说的缓存不命中。
当发生缓存不命中时,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了的话,就可能会覆盖现存的一个块
3.缓存不命中的种类
强制性不命中/冷不命中:第k层的缓存是空的,那么对任何数据对象的访问都不会命中。其中一个空的缓存称为冷缓存。
冲突不命中:对象会映射到同一个缓存块,缓存会一直不命中。
容量不命中:工作集的大小超过缓存的大小
4.缓存管理
管理缓存的逻辑可以是硬件,软件,或者是两者的结合。
5.总结:
基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序往往展示局部性:
(1)利用时间局部性
(2)利用空间局部性
6.4高速缓存存储器
6.4.1通用的高速缓存存储器结构
一个计算机系统,每个存储器地址有m位,形成M=2m个不同的地址。
如图,这样一个机器的高速缓存被组织成一个有S=2s个高速缓存组的数组。每个组包含E个高速缓存行
每个行是由一个B=2b字节的数据块组成的,一个有效位指明这个行是否包含有意义的信息,还有t=m-(b+s)个标记位
6.4.2直接映射高速缓存
1.直接映射高速缓存中的组选择
高速缓存从w的地址中间抽取出s个组索引位
2.直接映射高速缓存中的行匹配
上一步已经选择了某个组i,接下来的一步就要确定是否有字w的一个拷贝存储在组i包含的一个高速缓存中。
3.直接映射高速缓存中的字选择
一旦命中,我们知道w就在这个块的某个地方,最后一步确定的字在块中是从哪里开始的。
块偏移位提供了所需要的字的第一个字节的偏移。
4.直接映射高速缓存中不命中时的行替换
若果缓存不命中,那么它需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中。
6.4.3组相联高速缓存
1.组相联高速缓存中的组选择
2.组相联高速缓存中的行匹配和字选择
3.组相联高速缓存中的不命中时的行替换
6.4.4全相联高速缓存
1.全相联高速缓存中的组选择
2.全相联高速缓存中的行匹配和字选择
6.4.7高速缓存参数的性能影响
1.高速缓存参数的性能影响
2.块大小的影响
3.相联度的影响
4.写策略的影响
6.5总结:
1.基本存储技术包括随机存储器(RAM),非易失性存储器(ROM)和磁盘。ROM有两种基本类型。静态和动态。静态跟快,但贵,既可以做CPU芯片上的高速缓存,也可以在芯片下做高速缓存。动态慢一些,但便宜,用作主存和图形帧缓冲区。
2.非易失性存储器,即只读存储器,即使在关掉电源的时候,也能保持他们的信息,他们用来存储固件。旋转磁盘是机械的非易失的存储设备,以每个很低的成本保存大量的数据,但访问时间比DRAM长。
3.较快的存储技术每个位的价格会高,而且容量小。
4.一个优秀的程序员可以通过编写良好的空间和时间局部性来显著地改进程序的运行时间
一.实验总结:
2. 使用GDB调试以上代码:
编译代码的命令:gcc -g *.c -o main
制作一个math.a静态库:
ar rcvs math.a add.o sub.o mul.o div.o
main.c使用math.a:
制作一个mymath.so共享库:
gcc -shared -o math.so add.o sub.o mul.o div.o
main.c使用math.so:
注意:libmymath.so 要拷贝到/lib or /usr/lib:cp math.so /lib
vi makefile
testmymath: main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o testmymath
main.o: main.c head.h
gcc -c main.c
add.o: add.c head.h
gcc -c add.c
sub.o: sub.c head.h
gcc -c sub.c
mul.o: mul.c head.h
gcc -c mul.c
div.o: div.c head.h
gcc -c div.c
gcc –S –o main.s main.c -m32:编译成汇编代码
具体汇编代码:
二.收获和不足:
通过这一阶段的学习,我对计算机系统及其组成有了全新的认识,认识到了计算机系统的本质概念,并明白了这些概念是如何实实在在的影响应用程序的正确性,性能和实用性。从程序员的视角学习到如何利用系统知识编写更好的程序,同时我的动手也能力也有了进一步提升。在学习这门课之前,我对计算机的学习仅仅停留在书本中,认为对计算机的学习仅仅读书就够了,而随之到来的后果就是对部分概念认识及其意义的不甚了解,无法对计算机系统形成一个完整的认识。但在学习这么课的过程中,通过对老师提供各种实验和题目以及课本中家庭作业的学习,不但掌握了新的知识,对之前不明白的概念也有了准确的理解,使我受益匪浅,在接下来的学习实践中,我要继续将理论和实践相结合,举一反三地学习相关知识,深入理解计算机系统。
同时,在这阶段的学习过程中,我也有一些不足有待改进,比如对实验楼的实验步骤不求甚解,没有理解其意义,仅仅照着打,输出结果相同就算完成任务,导致到最后也没明白代码的意思。在今后的学习中我要在对代码的操作过程中也要理解并掌握代码,不让时间白白浪费。