综述:什么是指令那?指令就是计算机底层cpu能识别的不同操作,这是整个计算机最基础的操作,其他所有的实现都是使用这些不同的指令拼接而成的。本章就是介绍指令的基本构成和分类。
指令格式
指令最基本的格式由操作码和地址码构成,操作码(op)就是指令最核心的部分了,指出该指令应该执行什么样的操作,而地址码(ad)是被操作的数据或指令的地址。
根据不同指令的不同功能而所需要的被操作数的个数不同,就会有不同数量的地址码。地址码数量从0到4.
而操作码被分为两种,定长操作码(效率低,但是硬件简单)和变长操作码(效率高,但是硬件复杂)
ps:变长指令操作码要求,不允许短码是长码的前缀,这样会无法识别。
指令寻址
指令中的指令部分和数据部分都需要寻址,但是寻址的方式和内容不太一样。指令寻址是寻找下一条指令的地址,而数据寻址是寻找本条指令中地址码的地址。(地址码中的值不代表就是真实地址,所以需要结合寻址方式计算出真实地址)
指令寻址方式非常简单,顺序寻址和跳跃寻址,也即,没有指令要求你跳跃到其他地址时,就通过pc+1的方式寻址。(跳跃寻址实现了循环操作)
数据寻址的方式非常多,最后的真实地址要依靠寻址特征和形式地址A得出。
列举如下:
- 隐含寻址:不明显的给出操作数的地址,而是规定了某个寄存器中的数就是所要用的操作数,此种方式属于某些指令专用。(缩短指令长度,硬件复杂)
- 立即(数)寻址:立即就是立即数,立即数就是地址码字段没有给出地址,而是直接把操作数本身了,这种方法适合固定的某个操作数(补码),而不是变量。(不需要访存时间,地址码的位数限制了操作数的大小)
- 直接寻址:直接俩字意味着,地址码中的地址就是操作数真实的地址。(简单,位数限制了寻址范围,操作数地址不易修改)
- 间接寻址:地址码中给出的是操作数的地址(的地址)^n的地址,此所谓间接寻址。(可以方便完成子程序返回,多次中转速度比较慢,比不上寄存器间寻址)(寄存器存取速度最快)
- 寄存器寻址:地址码中直接给出寄存器代号(速度很快,价格昂贵资源有限)
- 寄存器间接寻址:地址码给出寄存器代号,但是寄存器中存的是操作数的主存单元的地址。可以扩大寻址范围。
- 相对寻址:此种方法要使用程序计数器pc,地址码给出偏移地址(计算机中的偏移量都是一个地址的动态部分,也就是说一个地址由固定部分和动态部分组成)。pc➕偏移地址得到真正地址。(适用于程序浮动,广泛应用于转移指令)
- 基址寻址:此种方法特别的用到了基址寄存器(用户可以指定用哪个,os决定内容),地址码给出的形式地址加上基址寄存器中的地址得到真正的地址。(可以扩大寻址范围,主要面向系统)
- 变址寻址:相比于基址寻址,变址寻址中的变址寄存器是专用的,而不像基址寻址中的可以用户自己指定。(主要面向用户)
- 堆栈寻址:设置一片堆栈空间,可以使用主存空间,也可以使用寄存器组(价格昂贵,空间小,速度很快),这一片空间符合先进后出的原则,就像一个栈。此种方法有些类似隐含寻址,使用此种方式的指令表面上无地址码操作数,但是其实就像隐含寻址一般有规定好的使用栈中的数据。由堆栈指针决定。
CISC(复杂指令集)和RISC(精简指令集)
复杂指令集:
- 指令系统庞大,指令数目多(200以上)
- 使用变长指令
- 指令访存不受限制(相比于精简指令集来说)
- 指令依据频度会分为常用指令和不常用指令
- 指令执行时间所需要的时钟周期不同
- 控制器使用微程序控制
- 难以优化编译生成高效代码
精简指令集:
- 指令数目少,使用一些频率较高的简单指令
- 使用定长指令
- 只有LORD/STORE两个指令可以访存,其他指令依靠寄存器之间进行
- 通用寄存器相比复杂指令集多很多
- 一定使用指令流水线
- 以硬布线控制为主(相对于复杂指令集的微程序控制)
- 相比于复杂指令集更容易优化代码
复杂指令集对应的就是x86架构,就是我们常用的Windows桌面系统。而精简指令集对应的就是arm架构,就是移动端的设备,相比硬件更加简单。
</div>