← 返回笔记列表

1.2.程序执行的过程和1.3.计算机指令

2026-03-10
计组汇编


笔记图片

一.引入 首先看一个加法的例子
1.执行过程首先通过存储器取出指令(机械指令)解码后,存储器发给解释单元,解释单元产生控制信号(即是cpu对应的CU核心单元)
2.驱动指令执行读出即load存储器的两个数到cpu的分别到cpu的两个寄存器中,然后在cpu的(alu算术单元)进行相加之后再返回存储器
概括下来3步
首先取指令 PC(PC默认加4(理由后续章节会说)),我这里认为是32位arm架构也就是4个字节八位二进制
其次分析指令IR,在解释器需要把提供的机械指令(汇编语言)解码成机械码也就是01的字符串
之后CU将指令执行(操作在计算机每次进行一个指令的时钟周期下进行)

二计算机指令
这些都是机械指令,还有许多其他指令没有写出,也有一些运算是通过伪指令实现的,但是我们人为写出,计算机会对应将这些伪指令替换成可替代的基础指令来进行操作

笔记图片


三.计算机指令的构成(后续还会更深入)
在计算机指令中,操作码和地址码是构成机器指令的两个核心部分,操作数和地址码之间的区别,注意它们的区别可以这样理解:

1. 定义
- 操作码:指定计算机要执行什么操作,比如加法,减法,跳转,读写内存等.它是指令的"动词".
- 操作数:指定操作的对象,即参与操作的数据或数据存放的位置.它是指令的"名词".
一条机器指令通常包含两部分:

- **操作码**:指定要执行什么操作(如加,减,读内存).
- **地址码**:指定参与操作的数据**从哪里来**或**送到哪里去**.地址码字段里存放的可能是一个**立即数**,一个**寄存器编号**,或者一个**内存地址**.

### 2. 操作数与地址码的关系
- **操作数** 是逻辑层面的概念,指指令操作的对象(即"对谁做").
- **地址码** 是物理层面的概念,指指令编码中用于指定操作数的字段.

所以,**地址码是操作数的载体**.
类比
想象你对一个人说:"把杯子里的水倒进盆里".
- "倒"就是操作码——告诉你做什么动作.
- "杯子里的水"和"盆"就是操作数——告诉你在哪个对象上做动作,以及动作的目标.

3. 在汇编语言中的例子
假设有一条汇编指令:
`ADD R1, R2`
- `ADD` 是操作码,表示要执行加法运算.
- `R1` 和 `R2` 是操作数,表示参与加法的两个数据分别来自寄存器 R1 和 R2,结果通常存回 R1(或指定位置).

另一个例子:
`MOV R0, #100`
- `MOV` 是操作码(传送数据).
- `R0` 和 `#100` 是操作数:R0 是目标寄存器,`#100` 是一个立即数(直接给出的数值).

4. 操作数的常见类型(也是所谓不同的地址码)
操作数可以指向不同地方:
- 立即数**:直接写在指令中的常数(如 `#100`).
- 寄存器**:数据存放在CPU寄存器中,指令中给出寄存器编号(如 `R1`).
- 内存地址**:数据存放在内存中,指令中给出地址或如何计算地址(如 `[R1]` 表示以R1内容为地址的内存单元).

5. 指令格式
一条指令通常由操作码字段和操作数字段组成,但不同指令需要的操作数个数不同:
- 零地址指令:只有操作码,比如空操作 `NOP`,停机 `HLT`.
- 一地址指令:一个操作数,如 `INC R1`(自增),`JMP LABEL`(跳转).
- 二地址指令:两个操作数,如上面的 `ADD R1, R2`.
- 三地址指令:三个操作数,如 `ADD R1, R2, R3` 表示 R2 + R3 → R1.

总结
- **操作码** 决定"做什么".
- **操作数** 决定"对谁做".
(注释;这个指令后面有的带括号有的不带括号后面会解释)
四.所谓伪指令
在硬件实现上,CPU的控制器会解析操作码,并指挥运算器根据操作数去取数,运算,存结果.两者结合才能完成一条指令的功能.
在 ARM 中常见的"做不到"例子
1. **直接操作内存的算术指令**(做不到):
- 你想写:ADD [r0], r1 (把 r1 加到内存中 r0 指向的单元)
- ARM 做不到,必须拆成:

LDR r2, [r0] ; 从内存读到寄存器
ADD r2, r2, r1 ; 在寄存器中做加法
STR r2, [r0] ; 存回内存

- 这个三步流程就是伪代码描述,实际代码是三条真指令.

2. 一条指令做 r0 = r0 + r0 + 4(做不到):
- 你想一步完成,但 ARM 没有三源加法指令.
- 必须拆成:

ADD r0, r0, r0 ; r0 = r0 * 2
ADD r0, r0, #4 ; 再加 4

- 前面的"一步完成"想法就是伪代码.

3. 直接比较两个内存单元(做不到):
- 你想写:CMP [r0], [r1]
- 实际要拆成:

LDR r2, [r0]
LDR r3, [r1]
CMP r2, r3
```

伪代码的本质
伪代码就是"用人类思维描述步骤,但忽略硬件限制"的写法.它帮助你在写真正汇编之前理清逻辑,然后再翻译成硬件真正支持的指令序列.
机器码:二进制01串
人类可读的机械码叫做汇编语言
c语言 python java等能在计算机运行的代码叫做高级语言,在执行前高级语言必须先被转换为本地机器码