计组-指令系统学习笔记

指令格式

指令(机器指令):是指示计算机执行某种操作的命令。

一台计算机所有的指令集合构成该机的指令系统,即指令集,又分为CISC(复杂指令集),RISC(精简指令集)

指令系统是计算机的主要属性,位于硬件和软件的交界面上。

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

一条指令通常包含操作码字段和地址码字段两部分。

操作码给出了指令具体做什么性质的操作和具有哪种功能,地址码给出被操作的内容(数据,指令)的地址。

74u0lF.png

指令的长度是指一条指令中所包含的二进制代码的位数。指令字长和机器字长没有固定的关系

在一个指令系统中,若所有指令的长度都是相等的,则称为定长指令字结构。优点:执行速度快,控制简单

若各种指令的长度随指令功能而异,则称为变长指令字结构

指令分类

根据操作数地址码的数目的不同

可分为:零地址指令(只给出操作码,如关机等)一地址指令(加一,减一,取反等),二地址指令(如两数加法等逻辑运算),三地址指令(如两数加法,第三个是结果保存的位置),四地址指令(一般最后一个操作数地址是给出下一条指令的地址)。

7f9wuD.png

定长操作码指令格式在指令字的最高位部分分配固定的若干位(定长)表示操作码。

一般n位操作码字段的指令系统最大能够表示 2^n(2的n次方)条指令。

对于简化计算机硬件设计,提高指令译码和识别速度很有利

扩展操作码指令格式:

为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码

最常见的变长操作码方法是扩展操作码,它使操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码

扩展操作码:在指令字长有限的前提下,采取变长操作码,即通过操作数地址码位数的减少来增加操作码的位数。还有通过在定长指令字长下不同操作地址数(如一操作数,二操作数,三操作数等)。

注意:在扩展操作码格式时,不允许短码(即短操作码)是长码(即长操作码)的前缀。各指令的操作码不能重复

7fCVqe.png

在上图的例子中,三地址指令中,操作码具有4位,并且全部使用的话就是16种,但要留1111作为扩展码(给其他的指令使用)

如果未用满16种,即只要用13种作为3地址指令,那么二地址指令就最多是3*15=45种

7filDS.png


指令的操作类型

1.数据传送:MOV、LOAD(从内存单元读取数据到cpu)、STORE(从cpu中写数据到内存单元)。
2.算术和逻辑运算:ADD、SUB、CMP(比较),MUL(乘)、DIV(除)、INC(加1)、DEC(减1)、AND(与操作)、OR(或)、NOT(非)、XOR(异或)。
3.移位操作:算术移位(SAL,SAR),逻辑移位(SHL,SHR),循环移位(ROL,ROR)等。
4.转移操作:JMP(无条件转移)、BRANCH(有条件转移)、CALL(调用)、RET(返回)、TRAP(陷阱:实现用户态转移到内核态)。
5.输出输出操作:完成cpu与外部设备交换数据和传送控制指令和状态信息。

7fV9mV.png


寻址方式

寻址方式即寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。

指令中的操作数地址码字段并不代表操作数的实际地址,称为形式地址(A),形式地址结合寻址方式可转为有效地址EA。获取的(EA)即有效地址,一般都是存储系统一章所讲的虚拟存储系统中的虚拟地址,之后还要通过段表或页表(根据存储方式)转为相应的内存物理地址。

注意:(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址

寻址方式分为指令寻址和数据寻址两大类

指令寻址

寻找下一条将要执行的指令地址称为指令寻址。

7fulz4.png

指令寻址有两种:

  1. 顺序寻址方式:通过程序计数器PC加1(1个指令字长),自动形成下一条指令的地址

  2. 跳跃寻址方式:通过转移类指令实现。

    所谓跳跃,是指下条指令的地址不由程序计数器PC自动给出,而由本条指令给出下条指令地址的计算方式

    跳跃的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),

    跳跃的结果是当前指令修改PC值,所以下一条指令仍然是通过PC给出


数据寻址

寻找本条指令的数据地址称为数据寻址。

10种:

  • 隐含寻址:这种类型的指令不明显给出操作数的地址,而在指令中隐含操作数的地址

    如在单地址的指令格式中不明显指出第二个操作数的地址,而规定累加器(ACC)作为第二操作数的地址

    优点:有利于缩短指令字长 。 缺点:需要增加存储操作数或隐含地址的硬件

  • 立即寻址:指令中的地址字段不是指出操作数的地址,而就是所操作的内容(即操作数本身),一般用补码表示。

    优点:指令在执行阶段不访问主存,指令执行时间最短

    缺点:地址码的位数,限制了立即数的范围

    7fYkN9.png

  • 直接寻址:指令中的形式地址A就是操作数的真实地址EA

7fYdHg.png

  • 间接寻址:是相对直接寻址而言,指令的地址字段给出的形式地址不是操作数真正地址,而是操作数有效地址所在存储单元的地址,也就是操作数地址的地址

    7ftJIJ.png

  • 寄存器寻址:是在指令字中直接给出操作数所在的寄存器编号,指定寄存器中的内容为操作数,,优点是无需访问主存,只访问寄存器,对应的地址码长度较小,当是寄存器的数量较小,且昂贵。

    7ftzeU.png

  • 寄存器间接寻址:指在寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址

7f0uRJ.png

  • 相对寻址:把PC(程序计数器)中的内容加上指令格式中形式地址A而形成操作数的有效地址EA,即EA=(PC)+A

    7f7GjI.png

  • 基址寻址:CPU中基址寄存器(BR)中的内容加上形式地址A而形成操作数的有效地址EA。程序执行过程中,基址寄存器中的内容不变,改变形式地址A,其中A的位数小于基址寄存器的位数。有利于多道程序设计,可用于编制浮动程序

7fyar9.png

  • 变址寻址:将CPU中变址寄存器(IX)中的内容加上形式地址A而形成操作数的有效地址EA。程序执行过程中,用户可改变变址寄存器的内容,不改变A的内容,其中A的位数小于变址寄存器的位数。主要用于处理数组问题

    在数组问题中,将A设为数组的首地址,不断改变变址寄存器的内容,即可容易形成数组中任一数据的地址

    适合编写循环程序

    7fhaAH.png
  • 堆栈寻址: 堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区。该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。

    堆栈分为硬堆栈(寄存器堆组成,成本较高) 和 软堆栈(主存中划出一块区域)

    通常情况下,在读/写堆栈中的一个单元的前后都伴有自动完成堆SP内容的增量或减量操作。

image

注意

在数据寻址中,指令中具有代表当前寻址方式的部分,如果具有以上10种寻址方式,那么寻址方式就需要4位二进制位来表示(16>10)

image


PC(程序计数器): PC总是指向下一条将要取指的指令地址。由于大多数指令都是按顺序来执行的,所以修改PC 的过程通常只是简单的对PC 加“指令字节数”。如果是转移指令,那就是将指令中的操作数地址码送入程序计数器PC中,从而实现程序的转移。

CPU总是按照PC的指向对指令序列进行取指、译码和执行,也就是说,最终是PC 决定了程序运行流向。故而,程序计数器(PC )属于特别功能寄存器范畴,不能自由地用于存储其他运算数据。
当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目 标地址。处理器总是按照PC 指向取指、译码、执行,以此实现了程序转移。


程序的机器级代码表示

相关寄存器

x86处理器中有8个32位的通用寄存器,分别是累加器(EAX),基地址寄存器(EBX),计数寄存器(ECX),数据寄存器(EDX),两个变址寄存器(ESI,EDI),堆栈基指针(EBP),堆栈顶指针(ESP)。

通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。八个寄存器都可以作为普通的数据寄存器使用。(共同功能)除此之外,各自具有其特殊功能。
image


汇编指令格式

一般具有两种指令格式:AT&T格式和Inter格式。

AT&T格式:只能用小写字母,第一个位源操作数,第二个为目的操作数,方向从左至右

ℹ️Inter格式:对大小写不敏感,第一个为目的操作数,第二个为源操作数,方向从右至左

汇编指令格式

jcondition指令:条件转移指令,依据CPU状态字中的一系列条件状态转移

  • jg是针对有符号数的大于号,jl是有符号数的小于号
  • ja是无符号数的大于 jb是无符号数的小于
  • je是当相等的时候 跳转
过程调用(函数调用)的机器级表示

call/ret指令主要用于过程调用,它们都属于一种无条件转移指令

每个过程(函数)都有自己的栈区(栈帧)是帧指针EBP和栈指针ESP指向的区域之间。
EBP保存的是帧指针,ESP是栈指针,一般都是固定EBP,改变ESP中的值。
EAX,ECX,EDX为调用者保存寄存器,调用者要将这三个寄存器中的值保存至自己的栈区,之后被调用者就可以直接使用这三个寄存器了,无需将其中的值保存至自己的栈区,当被调用者执行完,返回至调用者时,调用者就要从自己的栈区中获取之前保存好的数据恢复至三各寄存器中。
EBX,ESI,EDI为被调用者保存寄存器,被调用者在使用这三个寄存器之前,需要将其的值保存至自己的栈区中,之后要对寄存器中的值进行恢复。
过程调用的执行步骤 其中P为调用函数,Q为被调用函数,其中参数压栈的顺序是先右后左(栈是由高地址向低地址增长的)。

  • (1)P:P将入口参数(实参)放在 Q 能访问到的地方
  • (2)P:执行 call 指令,P 保存返地址,并将控制权转移给Q
  • (3)Q:保存 P 的现场,并为自己的非静态局部变量分配空间
  • (4)Q:执行 Q 的过程体(函数体)
  • (5)Q:恢复 P 的现场,释放局部变量空间
  • (6)Q:执行 ret 指令,取出返回值,将控制权转移给 P

例子

//c代码:函数调用
//被调用函数
int add(int x, int y)
{
    return x + y;
}
//调用者
int caller()
{
    int t1 = 125;
    int t2 = 80;
    int sum = add(t1, t2);
    return sum;
}

函数对于内存中的栈分布情况:
image

选择语句的机器级表示

选择结构语句:如 if-else 、if-then-else switch

编译器根据条件码(标志位)设置指令和各类转移指令来实现程序中的选择结构语句

转移指令 如 jmp,jcondition指令(jg,jge,jl,ja,jb)

switch语句实现多路选择功能,通过跳转表来实现。

swich语句实现-跳转表

循环语句的机器级表示

常见的循环结构语句有for、while、do-while。

在汇编语言中没有直接的循环结构指令,是通过条件测试和跳转组合起来实现循环的效果

汇编语言实现循环结构

CISC和RISC的基本概念

CISC:

增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化,即复杂指令系统计算机
如x86架构计算机

  • 指令长度不固定,指令格式种类多,寻址方式多。
  • 采用微程序控制,有些指令很复杂,以至无法采用硬布线控制。
  • 大多数指令需要多个时钟周期才能完成。
  • 难以优化编译生成高效程序。

事先把微操作控制信号存储在一个专门的存储器(控制存储器)中,将每一条机器指令编写成一个微程序,这些微程序可以存到一个控制存储器中,用寻址用户程序机器指令的办法来寻址每个微程序中的微指令。

RISC:
精简指令计算机的中心思想:要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致
如ARM,MIPS架构计算机

  • 指令长度固定,指令格式种类少,寻址方式种类少。
  • 以硬布线控制为主,不要或少用微程序控制。
  • 只有Load/Store(取数和存储)指令访存,其余指令都在寄存器之间进行。
  • CPU中通用寄存器数量较多。
  • 一定采用指令流水线技术,大多数指令完成只需1个时钟周期。

硬布线控制器是将控制部件做成产生专门固定 时序控制 信号的逻辑电路,产生各种控制信号,因而又称为组合逻辑控制器。微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生。

对比总结

在这里插入图片描述

在这里插入图片描述
posted @   林之在  阅读(410)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示