计算机系统层次结构核心笔记
一、计算机硬件基本组成
计算机硬件系统由五大基本部件构成,它们协同工作完成数据处理和指令执行任务:
- 输入设备:将外部信息转换为计算机可识别的电信号(如键盘、鼠标)
- 输出设备:将计算机处理结果转换为人类可识别的形式(如显示器、打印机)
- 存储器:分为主存储器(内存)和辅助存储器(外存),用于存储数据和指令
- 运算器:执行算术运算和逻辑运算
- 控制器:控制计算机各部件协调工作
核心概念 :程序本身用高级语言编写,需经过编译转换为机器语言才能被计算机执行。机器语言由指令 和数据两部分组成,它们在存储器中以二进制形式存储。
二、主存储器与CPU的交互
主存储器(内存)是CPU能直接访问的存储器,由存储体、地址寄存器(MAR)和数据寄存器(MDR)组成。
2.1 主存储器的组成
- 存储体:由大量存储单元组成,每个存储单元有唯一的地址
- MAR(地址寄存器):存放要访问的存储单元地址,其位数决定了可寻址的存储单元个数
- MDR(数据寄存器):存放从存储体读出或要写入存储体的数据,其位数等于存储字长
2.2 CPU与主存的数据传输过程
读数据过程(CPU从主存取数据)
CPU → MAR(地址)→ 存储体 → MDR(数据)→ CPU
- CPU将数据的地址发送到MAR地址寄存器
- MAR根据地址从存储体中找到对应的存储单元
- 存储单元中的数据被取出并放置在MDR数据寄存器中
- CPU从MDR数据寄存器中读取数据
写数据过程(CPU向主存存数据)
CPU → MAR(地址)
CPU → MDR(数据)
CPU → 写信号 → 存储体
- CPU将要写入数据的地址发送到MAR地址寄存器
- CPU将要写入的数据发送到MDR数据寄存器
- CPU向主存储器发送写入数据的控制信号
- 主存储器将MDR中的数据存入MAR指定的地址单元
2.3 主存容量计算
- 存储单元个数 = 2^MAR位数
- 存储字长 = MDR位数(单位:bit)
- 总容量 = 存储单元个数 × 存储字长(bit)= 存储单元个数 × 存储字长 / 8(Byte)
示例:
- MAR=4位 → 2^4=16个存储单元
- MDR=16位 → 每个存储单元可存放16bit(1个字)
- 总容量 = 16 × 16bit = 32Byte
易混淆概念:
- 1字节(Byte) = 8bit
- 1B = 1字节,1b = 1bit
- 1字(word)的长度由计算机架构决定,通常为16bit、32bit或64bit
三、运算器:算术与逻辑运算的核心
运算器是计算机中执行算术运算和逻辑运算的部件,主要由以下寄存器和功能单元组成:
| 寄存器/单元 | 功能 |
|---|---|
| ACC(累加器) | 存放操作数或运算结果 |
| MQ(乘商寄存器) | 乘除运算时存放操作数或运算结果 |
| X(通用操作数寄存器) | 存放操作数 |
| ALU(算术逻辑单元) | 通过内部电路实现算术运算(加减乘除)和逻辑运算(与或非) |
运算器寄存器在不同运算中的作用
| 运算类型 | ACC | MQ | X |
|---|---|---|---|
| 加法 | 被加数、和 | - | 加数 |
| 减法 | 被减数、差 | - | 减数 |
| 乘法 | 乘积高位 | 乘数、乘积低位 | 被乘数 |
| 除法 | 被除数、余数 | 商 | 除数 |
四、控制器:计算机的指挥中心
控制器负责控制计算机各部件协调工作,是计算机的"大脑",主要由以下部件组成:
| 部件 | 功能 |
|---|---|
| CU(控制单元) | 分析指令,产生控制信号,控制其他部件工作 |
| IR(指令寄存器) | 存放当前正在执行的指令,对用户透明 |
| PC(程序计数器) | 存放下一条要执行的指令地址,具有自动加1功能 |
透明概念:在计算机中,"透明"指某个部件或功能存在并正常工作,但用户不需要了解其内部实现细节。例如,我们不需要知道指令寄存器如何存储指令,只需知道它能完成指令存储的功能。
五、计算机的完整工作过程
计算机的工作过程本质上是不断取指令、分析指令和执行指令的循环过程。
5.1 指令与数据的存储
指令和数据都以二进制形式存储在主存储器中,CPU通过指令周期的不同阶段来区分它们:
- 取指阶段:从主存中取出的是指令
- 执行阶段:从主存中取出的是数据
5.2 工作过程示例(计算y=a*b+c)
假设主存中存储了以下指令和数据:
| 地址 | 内容 | 含义 |
|---|---|---|
| 0 | 000001 0000000101 | 取数a至ACC |
| 1 | 000100 0000000110 | 乘b得ab,存于ACC中 |
| 2 | 000011 0000000111 | 加c得ab+c,存于ACC中 |
| 3 | 000010 0000001000 | 将ab+c存于主存单元 |
| 4 | 000110 0000000000 | 停机 |
| 5 | 0000000000000010 | 原始数据a=2 |
| 6 | 0000000000000011 | 原始数据b=3 |
| 7 | 0000000000000001 | 原始数据c=1 |
| 8 | 0000000000000000 | 原始数据y=0 |
执行步骤:
- 取指阶段:PC=0,从主存地址0取出指令"取数a至ACC",存入IR,PC自动加1变为1
- 执行阶段:根据指令地址码0000000101(十进制5),从主存地址5取出数据2,存入ACC
- 取指阶段:PC=1,从主存地址1取出指令"乘b得ab",存入IR,PC自动加1变为2
- 执行阶段:根据指令地址码0000000110(十进制6),从主存地址6取出数据3,与ACC中的2相乘,结果6存入ACC
- 取指阶段:PC=2,从主存地址2取出指令"加c得ab+c",存入IR,PC自动加1变为3
- 执行阶段:根据指令地址码0000000111(十进制7),从主存地址7取出数据1,与ACC中的6相加,结果7存入ACC
- 取指阶段:PC=3,从主存地址3取出指令"将结果存于主存",存入IR,PC自动加1变为4
- 执行阶段:根据指令地址码0000001000(十进制8),将ACC中的7存入主存地址8
- 取指阶段:PC=4,从主存地址4取出指令"停机",存入IR
- 执行阶段:执行停机指令,计算机停止工作
最终,主存地址8中的数据变为7,即y=7。
六、栈帧与函数调用机制
栈是一种"后进先出"(LIFO)的数据结构,在计算机中用于实现函数调用和局部变量存储。
6.1 栈的基本操作
x86架构中,栈默认以4字节为单位进行操作,主要使用两条指令:
- push:先将esp(栈指针)减4,再将src中的数据压入栈顶
- pop:将栈顶元素弹出写入dest,再将esp加4
注:src可以是立即数、寄存器或主存地址;dest可以是寄存器或主存地址。
6.2 栈帧结构
栈帧是为每个函数调用分配的栈空间,用于存储函数的参数、局部变量、返回地址等信息。
高地址
+-----------------+
| |
| 其他数据 |
| |
+-----------------+
| main栈帧 |
| |
+-----------------+
| caller栈帧 |
| |
+-----------------+
| add栈帧 |
| |
+-----------------+ <-- esp(栈顶)
低地址
- ebp(基址指针):指向当前栈帧的底部
- esp(栈指针):指向当前栈帧的顶部
6.3 函数调用时的栈帧切换
函数调用主要通过call、enter、leave和ret指令实现。
call指令的作用
- 将下一条指令的地址(返回地址)压入栈中保存
- 无条件跳转到被调用函数的第一条指令
被调用函数的栈帧初始化(enter指令等价于)
asm
push ebp ; 保存上一层函数的栈帧基址
mov ebp, esp ; 设置当前函数的栈帧基址
sub esp, n ; 为局部变量分配n字节的栈空间
函数返回过程(leave指令等价于)
asm
mov esp, ebp ; 释放当前函数的局部变量空间
pop ebp ; 恢复上一层函数的栈帧基址
ret ; 从栈中弹出返回地址,跳转到该地址继续执行
6.4 函数调用完整示例
caller函数调用add函数的过程:
1. caller执行call add指令
- 将返回地址(call指令的下一条指令地址)压入栈
- 跳转到add函数的入口
2. add函数执行
- push ebp ; 保存caller的ebp
- mov ebp, esp ; 设置add的栈帧基址
- sub esp, 24 ; 为add的局部变量分配24字节空间
- ... 执行函数体 ...
- leave ; 释放add的栈空间,恢复caller的ebp
- ret ; 弹出返回地址,跳转到caller继续执行
七、总结
计算机系统层次结构是理解计算机工作原理的基础。从硬件层面看,计算机由输入输出设备、存储器、运算器和控制器组成;从软件层面看,高级语言需要经过编译转换为机器语言才能被计算机执行。
CPU与主存的交互是计算机工作的核心,通过MAR和MDR实现地址和数据的传输。运算器负责执行算术和逻辑运算,控制器负责控制各部件协调工作。计算机的工作过程本质上是取指-执行的循环过程。
栈帧机制是实现函数调用的关键,通过ebp和esp两个指针管理栈空间,call和ret指令实现函数的调用和返回。理解这些概念对于深入学习计算机组成原理和汇编语言至关重要。