CPU通过不同的阶段和不同的机制来区分指令和数据。
一、从时间上来说:
-
取指令阶段(Fetch Stage):
- 在指令周期的第一个CPU周期中,程序计数器(PC)中的地址被用来从内存中取出一条指令。
- 取出的指令被存储在指令寄存器(Instruction Register, IR)中。
- 程序计数器随后增加以指向下一条指令的地址。
-
执行阶段(Execute Stage):
- 在后续的CPU周期中,指令寄存器中的指令被译码和执行。
- 如果指令需要操作数据(例如读写内存数据),那么这些数据的地址会在执行阶段从内存中取出,并被送到CPU的运算器(ALU)或者其他相关部件。
二、从空间上来说:
- 指令和数据的传输路径:
- 指令:从内存取出的指令首先被送到指令寄存器(IR)。指令寄存器是专门用来存储即将被执行的指令的。
- 数据:如果指令涉及数据操作(例如加载、存储、加法、减法等),那么从内存取出的数据会被送到运算器(ALU)或者其他指定的寄存器,以进行进一步处理。
实际过程示例:
-
取指令(Fetch):
- PC -> MAR(内存地址寄存器):程序计数器的值被加载到内存地址寄存器中。
- 内存读取操作:内存地址寄存器指定的地址被读取,内容(指令)被送到MDR(内存数据寄存器)。
- MDR -> IR:内存数据寄存器中的内容被加载到指令寄存器中。
- PC + 1:程序计数器增加,指向下一条指令。
-
指令译码和执行(Decode and Execute):
- 指令寄存器中的指令被译码(确定操作码和操作数)。
- 如果需要数据操作,操作数地址会被加载到内存地址寄存器中。
- 内存读取/写入:数据被读取或写入到指定地址,并送到运算器(ALU)进行处理。
通过这些机制,CPU能够有效地区分指令和数据,并在正确的时间和正确的位置对它们进行处理。这些步骤确保了指令和数据在内存中的有序存储和处理,从而实现计算机的正常运行。
让我们通过一个简单的汇编语言例子来展示CPU如何区分指令和数据。在这个例子中,我们将使用一种假设的简单汇编语言来说明指令的取指(fetch)和数据的取数(fetch data)过程。
假设我们的指令集架构(ISA)包括以下指令:
- `LOAD R1, 100`: 将内存地址100处的数据加载到寄存器R1中。
- `ADD R1, R2, R3`: 将寄存器R2和R3的值相加,并将结果存储在寄存器R1中。
- `STORE R1, 200`: 将寄存器R1中的值存储到内存地址200处。
- `HALT`: 停止程序执行。
假设内存中有以下内容(每个单元存储一条指令或一个数据):
|
### 代码示例
假设我们的程序开始执行时,程序计数器(PC)指向地址0。
0: LOAD R1, 100 ; 指令:从内存地址100加载数据到R1
1: ADD R1, R2, R3 ; 指令:将R2和R3相加,结果存储到R1
2: STORE R1, 200 ; 指令:将R1的值存储到内存地址200
3: HALT ; 指令:停止程序
100: 42 ; 数据:内存地址100处的值
101: 58 ; 数据:内存地址101处的值
200: 0 ; 数据:内存地址200处的初始值
执行过程
1. **取指令阶段(Fetch):**
- **PC = 0**: 取指令`LOAD R1, 100`,将其加载到指令寄存器(IR)。
- **IR**: 现在包含指令`LOAD R1, 100`。
2. **执行阶段(Execute):**
- 译码指令,确定这是`LOAD`操作。
- 从内存地址100处取出数据42,加载到寄存器R1。
- **R1 = 42**。
3. **取指令阶段(Fetch):**
- **PC = 1**: 取指令`ADD R1, R2, R3`,将其加载到指令寄存器(IR)。
- **IR**: 现在包含指令`ADD R1, R2, R3`。
4. **执行阶段(Execute):**
- 译码指令,确定这是`ADD`操作。
- 假设初始时**R2 = 5**,**R3 = 10**。
- 计算`R2 + R3`的值,将结果存储到寄存器R1。
- **R1 = 15**(因为5 + 10 = 15)。
5. **取指令阶段(Fetch):**
- **PC = 2**: 取指令`STORE R1, 200`,将其加载到指令寄存器(IR)。
- **IR**: 现在包含指令`STORE R1, 200`。
6. **执行阶段(Execute):**
- 译码指令,确定这是`STORE`操作。
- 将寄存器R1中的值(15)存储到内存地址200处。
- 内存地址200处的值现在是15。
7. **取指令阶段(Fetch):**
- **PC = 3**: 取指令`HALT`,将其加载到指令寄存器(IR)。
- **IR**: 现在包含指令`HALT`。
8. **执行阶段(Execute):**
- 译码指令,确定这是`HALT`操作。
- 停止程序执行。
#关键点
- **取指令(Fetch)**阶段从内存中取出的是指令,并放入指令寄存器(IR)。
- **执行阶段(Execute)**可能涉及从内存中取出数据(如`LOAD`指令)或将数据存储到内存中(如`STORE`指令)。
- CPU通过程序计数器(PC)和指令寄存器(IR)管理指令流,通过不同的指令类型和操作码来区分和处理数据。
通过这种机制,CPU能够有效地区分和处理内存中的指令和数据。