前面假设每一条机器指令都是能放在一个字内的。这是一种理想状况,是难以满足的。
对于一个字长为32位的机器指令,Move 24(R0),R5
应该如何用机器码表示
这个指令有三个部分,Move指明操作,24(R0)和R5标明使用的寄存器地址。
假设使用8bit位说明该操作为Move操作
且该处理器有16个寄存器,则需要0000-1111
4个比特位标明地址。也就是R0和R5共使用8位来说明。
此外使用变址的寻址方式,需要一些附加位来说明寻址方式,假设说明寻址方式需要3位,则两个操作数共需要6bit位说明寻址方式。
如果要将这个指令放入32位字中,则剩下10能用来说名变址的数值是24以及其他信息。
这种情况勉强能处理。
考虑一种更坏的情况,Move A,R0
将内存单元A中的内存复制到寄存器R0中,现在内存动辄就是G计算,也就是1G=102410241024B,假设内存大小为1G,光是说明内存单元A的地址就需要30位,这显然是无法放下的。
要解决这种问题,有两种方案
- 一个指令可以由多个连续字共同表示。
- 不让这种情况发生。不允许在指令中直接使用内存地址的寻址方式。
这两种解决方案分别对应了现在的两类指令集
精简指令集RISC的一个重要特征就是,每一条指令都只能由一个字表示,典型如手机中的ARM指令集
复杂指令集CISC则是一个指令可以多个连续字表示,典型如Intel与AMD平台的X86指令集
讨论一个指令只能在存放一个字的情况
会有一个问题就是,处理器寄存器中的内容,仍然是从内存中来的,必然由使用指令将内存数据载入寄存器的情况,这就必须要说明内存单元的地址。一种可能的解决方案是,汇编程序直接将所需要的地址放到靠近程序的数据区中的一个字单元中,用相对寻址方式的方式装载该地址。另外一种方案是,使用给出地址的较小部分,然后用逻辑和移位指令构造所需要的地址。