一 机器指令
能够被计算机CPU识别并且操作的命令,就是机器指令。软件通过指令告诉硬件干什么,硬件把结果和状态通过指令系统返回给软件。
1.1 指令的格式
操作码 地址码 寻址方式
1.1.1操作码
机器要做什么操作
1.1.2 地址码
第一种:四地址
A1: 第一个操作数地址
A2: 第二个操作数地址
A3: 结果的地址
A4: 下一条指令的地址,利用A4取下一条指令
假设指令字长为32位,操作码固定位8位,则剩余的24位分配给4个操作数,则每一个操作数是6位,寻址范围是2^6 =64,如图示:
很明显这样的范围是不够用,也不可用的。
第二种:三地址
在现代的计算机中,一般使用硬件程序计数器,来存储下一条要访问的指令,来代替A4. 那么4地址就可以变为3地址,从而可以增加每一个操作数的寻址范围。如图示:
那么每一个操作数可寻址范围就是2^8 = 256,即每一个地址码的长度增加了
第三种:二地址
我们将计算结果不再保存到A3地址中,而是保存到A1或者A2的地址中
地址码从三个变为2个,每一个地址码长度增加了,2^12 = 4096
如果我们不把结果保存在A1或者A2当中,而是保存在指定一个寄存器当中,比如放在ACC, 这样就可以减少访存次数。
第四种:一地址
只要我们知道一个操作数的在内存中地址和ACC,那么我们就可以把另外一个操作数和操作结果都放在ACC中,这样还可以继续增加地址码的长度,变为24位,为2^24 = 16M, 而且只需要2次访问内存
1.2 指令的字长
指令的字长取决于操作码和地址码,如果指令字长是可变的,那么地址码的个数对指令的字长也是有影响的。
二 操作数的类型和种类
2.1 操作数类型
地址:比如跳转指令,操作的就是地址
数字:定点数、浮点数、十进制数
字符:ASCII
逻辑数:逻辑运算
2.2 数据在存储器中存放方式
比如1 2 3 4 5 6 7 8 H
数据在存储器中存储方式(存储字长64位,机器字长32位)
存储字长:表示CPU在访问内存的过程中,一个存储单元(存储地址)所存储的二进制代码的位数,即存储器中的MDR的位数
机器字长:表示CPU一次能处理数据的位数,通常与CPU的寄存器位数有关
在这里因为机器字长是32位,所以1字=4字节;存储字长是64位,所以是双字,即2个32位
2.2.1 从任意位置开始编址
那可能一个数据是1个字(32位),也可能是半字(16位),也有可能是双字(64位)。
优点:存储紧凑,不浪费资源
缺点:读写控制比较麻烦
2.2.2 从一个存储字的起始位置开始:
优点:每一次都从一个存储字的起始地址开始。任何类型的数据都可以保证在一个主存周期内完成,读写控制简单
缺点:浪费内存资源
2.2.3 边界对准方式,从地址的整数倍位置开始:
如果是半字,即16位,2字节,则从地址是2的倍数的位置开始存储
如果是字,即32位,4字节,则从地址是4的倍数的位置开始存储
如果是双字,即64位,8字节,则从地址是8的倍数的位置开始存储
优点:可以保证任何类型,一个存取周期就可以读写的数据,是前两个方法的折中;也减少了存储空间的浪费。数据存放的起始地址是数据长度的倍数
2.3 操作的类型
2.3.1 数据传送
2.3.2 算术逻辑运算
加(add)、减(sub)、乘(mul)、除(div) 增1(inc) 减1(dec) 求补(cmp) 浮点运算
与(and) 或(or) 非(not) 异或(xor) 位操作
2.3.3 移位
2.3.4 转移
无条件转移:JMP
条件转移:JZ(结果为零转移),JO(结果溢出转移),跳过一条指令(SKP)
调用和返回:call return
2.4 陷阱和陷阱指令
陷阱:可预知的意外事件
陷阱指令:INT TYPE
三 寻址方式
3.1 什么是寻址方式
确定本条指令的操作数地址或者下一条要执行的指令的指令地址,说白了就是如何找到指令或者指令要操作的数据的地址。
所以寻址方式又可以具体分为指令寻址和数据寻址。
3.2 指令寻址
顺序寻址:取完一条指令,顺序取下一条指令,比如PC的地址加1,然后送入到PC当中,那这里是不是在任何一台计算机都是可以的?
如果内存存储单元编址单位是字节,每一条指令的长度是32位,即4个字节,顺序寻址的时候就是+4;如果是64位,则顺序寻址的时候就是+8。
跳跃寻址:由转移指令指出下一条指令它的地址
3.3 数据寻址
操作码:操作类型
寻址方式:使用哪一种寻址方式
形式地址:取决于寻址方式
假设指令字长=机器字长=存储字长
3.3.1 立即寻址
形式地址直接给出来的就是操作数,直接参与操作码指定的运算。
指令的执行阶段,不需要访存
3.3.2 直接寻址
有效地址就是形式地址,也就是是真正内存单元的物理地址。把A这个地址的操作数送到CPU的ACC寄存器中去。A地址的位数决定了该指令的寻址范围
缺点:操作数的地址不易修改
3.3.3 隐含寻址
我们把寻址方式隐藏到操作码之中
3.3.4 间接寻址
有效地址由形式地址间接提供。
指的是形式地址指向的是内存中一个地址,但是这个地址的值仍然是一个地址,即真实的地址,这种方式需要访存2次,而且便于编制程序。
3.3.5 寄存器寻址
有效地址即为寄存器编号,CPU需要从给定的编号的寄存器中把操作数取出来,进行相应的操作。
3.3.6 寄存器间接寻址
地址保存的是一个在寄存器中的地址,这个寄存器中的地址保存的是操作数真正在内存中的物理地址。
3.3.7 基址寻址
3.3.7.1 采用专用的寄存器作为基址寄存器
有效地址是基准寄存器中保存的内容+形式就可以得到内存的物理地址
优点:扩大了寻址范围,因为基址寄存器给定了一个首地址,然后指令中地址A只是一个偏移量;另外,非常有利于多道程序设计,多到程序分时进行执行的时候,程序的起始地址可以放在基址寄存器,执行过程中动态产生操作数地址,也叫动态定位。
3.3.7.2 基于通用地址寄存器作为基址寄存器
3.3.8 变址寻址
指定一个变指寄存器作为基址寄存器。用户可以修改变址寄存器的地址,这是和基址寄存器不一样地方。
3.3.9 相对寻址
用程序计数器中地址加上程序里的地址,形式地址相当于当前指令的位移量。
A的位数决定了相对地址的寻址范围。