即使是前面示例中显示的极其简单的微处理器也有相当大的指令集可以执行。18新利最新登入指令集合被实现为位模式,当加载到指令寄存器中时,每一个位模式都有不同的含义。人类不是特别擅长记忆位模式,所以定义了一组简短的单词来表示不同的位模式。这个单词的集合被称为汇编语言处理器的。一个汇编程序可以很容易地将字转换为它们的位模式,然后将汇编器的输出放在内存中供微处理器执行。
下面是设计人员在我们的例子中为简单的微处理器创建的一组汇编语言指令:
- LOADA mem-从内存地址加载寄存器A
- LOADB mem-从内存地址加载寄存器B
- CONB反对-加载一个常数值到寄存器B
- SAVEB mem—将寄存器B保存到内存地址
- SAVEC mem—将寄存器C保存到内存地址
- 添加—将A和B相加,并将结果存储在C中
- 子-减去A和B并将结果存储在C中
- MUL将A和B相乘,并将结果存储在C中
- DIV—将A和B相除,将结果存储在C中
- COM-比较A和B,并将结果存储在test中
- 跳addr-跳转到地址
- JEQ addr-如果相等,跳转到地址
- JNEQaddr -如果不相等,跳转到地址
- 詹addr-如果大于,则跳转到地址
- JGE addr—如果大于或等于,则跳转到寻址
- JL addr-如果小于,跳转到地址
- JLE addr-如果小于或等于,则跳转到地址
- 停止-停止执行
如果你读过18新利最新登入C语言编程原理,那么你就知道这段简单的C代码将计算5的阶乘(其中5的阶乘= 5!= 5 * 4 * 3 * 2 * 1 = 120):
A =1;f=1;while (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跳转到175 CONB 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 STOP
罗
那么现在的问题是,“所有这些指令在ROM中看起来如18新利最新登入何?”这些汇编语言指令中的每一条都必须用二进制数表示。为了简单起见,让我们假设每条汇编语言指令都有一个唯一的编号,如下所示:
- 负载- 1
- Loadb - 2
- Conb - 3
- 萨维布- 4
- SAVEC mem - 5
- 加- 6
- Sub - 7
- 穆尔- 8
- Div - 9
- Com - 10
- 跳转地址- 11
- JEQ地址- 12
- JNEQ addr - 13
- JG addr - 14
- JGE地址- 15
- JL addr - 16
- JLE地址- 17
- Stop - 18
这些数字被称为操作码.在ROM中,我们的小程序看起来是这样的:
/ /假设地址128 / /假设F是地址129 addr操作码/ value0 3 / / CONB 11 12 1283 1284 3 / / / / SAVEB CONB 15 16 4 / / / / LOADA SAVEB 1297 1298 1289 12810 511 512 10 / / / / CONB COM13 14 / / / / LOADA詹1714 3115 12916 12917 12818 12819 8 / / / / LOADB MUL20 5 / / / / LOADA SAVEC 12921 12922 12823 12824 125 126 6 / / / / CONB ADD27 5 / / SAVEC 12828 12829 430 831 18 / / /跳/停止
你可以看到,7行C代码变成了18行汇编语言,在ROM中变成了32字节。
解码
指令解码器需要将每个操作码转换成一组信号,驱动微处理器内部的不同组件。让我们以ADD指令为例,看看它需要做什么:
- 在第一个时钟周期中,我们需要加载指令。因此,指令解码器需要:
- 激活程序计数器的三状态缓冲区
- 激活RD线
- 激活data-in三状态缓冲区
- 把指令锁入指令寄存器
- 在第二个时钟周期中,ADD指令被解码。它需要做的很少:
- 设置ALU的运算为加法
- 将ALU的输出锁存到C寄存器中
- 在第三个时钟周期中,程序计数器增加(理论上这可以重叠到第二个时钟周期中)。
每条指令都可以分解为一组像这样按适当顺序操作微处理器组件的有序操作。有些指令,比如ADD指令,可能需要2到3个时钟周期。其他的可能需要5到6个时钟周期。