即使在上一个示例中显示的非常简单的微处理器也具有相当大的指令。指令的集合被实现为位模式,每个指令都将其加载到指令寄存器中时具有不同的含义。人类并不是特别擅长记住位模式,因此定义了一组简短的单词来代表不同的位模式。这个单词的集合称为组装语言处理器。一个汇编器可以很容易地将单词转换为其位模式,然后将汇编器的输出放置在存储器中,以供微处理器执行。
这是设计师在我们的示例中为简单的微处理器创建的一组汇编语言指令:
- LOADA MEM- 从内存地址加载注册
- LOADB MEM- 从内存地址加载寄存器b
- Conb Con- 将常数值加载到寄存器B中
- 保存mem- 将寄存器b保存到内存地址
- Savec Mem- 将寄存器C保存到内存地址
- 添加- 添加A和B并将结果存储在C中
- 子- 减去A和B并将结果存储在C中
- mul- 乘以A和B并将结果存储在C中
- div- 分配A和B并将结果存储在C中
- com- 比较A和B并将结果存储在测试中
- 跳addr- 跳到地址
- jeq addr- 跳(如果平等)来解决
- jneqaddr-跳跃(即使不是平等)来解决
- JG addr- 跳跃,如果大于解决
- jge addr- 跳跃(如果大于或相等)来解决
- JL addr- 跳(如果少于)来解决
- jle addr- 跳跃(如果少于或平等)来解决
- 停止- 停止执行
如果您读过C编程如何工作,然后您知道这件简单的C代码将计算5个阶乘(其中5 = 5!= 5 * * 4 * 3 * 2 * 1 = 120):
a = 1; f = 1;而(a <= 5){f = f * a;a = a + 1;}
在程序执行结束时,变量F包含5个阶乘。
组装语言
一种C编译器将此C代码转换为汇编语言。假设RAM从该处理器中的地址128开始,并且ROM(包含汇编语言程序)从地址0开始,那么对于我们的简单微处理器,汇编语言可能看起来像这样:
//假设a在地址128 //假设f在地址1290 conb 1 // a = 1; 1 saveb 1282 conb 1 // f = 1; 3 saveb 1294 loada 128 //如果> 5> 5跳到175CONB 56 COM7 JG 178 LOADA 129 // f = f*a; 9 LOADB 12810 MUL11 SAVEC 12912 LOADA 128 // a = A+1; 13 CONB 114 ADD15 SAVEC 12816跳跃4 //循环回到IF17停止返回IF17
只读存储器
因此,现在问题是:“所有这些说明在ROM中的外观如何?”这些汇编语言指令中的每一个都必须由二进制编号表示。为了简单起见,让我们假设每个汇编语言指令都有一个唯一的数字,例如:
- LOADA -1
- LOADB -2
- CONB -3
- 保存-4
- SAVEC MEM -5
- 添加-6
- 子-7
- MUL -8
- Div -9
- com -10
- 跳跃addr -11
- jeq addr -12
- jneq addr -13
- JG ADDR -14
- jge addr -15
- JL ADDR -16
- JLE ADDR -17
- 停止-18
这些数字被称为opcodes。在ROM中,我们的小程序看起来像这样:
//假设a在地址128 //假设f在地址129ADDR OPCODE/value0 3 // CONB 11 12 4 // SAVEB 1283 1284 3 // CONB 15 16 4 // SAVEB 1297 1298 1 // LOADA 1289 1289 12810 3// CONB 511 512 10 // COM13 14 // JG 1714 3115 1 // LOADA 12916 12917 2 // LOADB 12818 12819 8 // MUL20 5 // SAVEC 12921 12922 1 // LOADA 12823 12823 12823 12824 3 //// ADD27 5 // SAVEC 12828 12829 11 //跳跃430 831 18 //停止
您会看到,七行C代码变成了18行汇编语言,并且在ROM中变成了32个字节。
解码
指令解码器需要将每个Opcodes变成一组信号,这些信号驱动微处理器内部的不同组件。让我们以添加指令为例,看看它需要做什么:
- 在第一个时钟周期中,我们需要加载指令。因此,指导解码器需要:
- 激活程序计数器的三态缓冲区
- 激活RD线
- 激活数据中的三态缓冲区
- 将指令锁定到指令登记册中
- 在第二个时钟周期中,添加指令被解码。它需要做的很少:
- 将Alu的操作设置为加法
- 将ALU的输出锁定到C寄存器中
- 在第三个时钟周期中,程序计数器会增加(从理论上讲,这可以重叠到第二个时钟周期)。
每个指令都可以作为一组类似的测序操作分解,以适当的顺序操纵微处理器的组件。一些说明,例如此添加指令,可能需要两个或三个时钟周期。其他人可能需要五个或六个时钟周期。