• 【计算机组成原理】指令系统-寻址


    一、指令和数据的寻址方式

    操作数或指令在存储器中的地址:某个操作数或某条指令存放在某个存储单元时其存储单元的编号

    在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式和堆栈存取方式。

    寻找方式:当采用地址指定方式时,形成操作数或指令地址的方式。

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

    1)指令寻址:确定下一条预执行指令的指令地址

    a、顺序寻址:(PC)+1->PC    程序计数器自动加1

    b、跳跃寻址:由转移指令指出

    2)数据寻址:确定本条指令的操作数地址

    指令中所给出的地址码,并不一定是操作数的有效地址。

    寻址过程就是把操作数的形式地址,变换为操作数的有效地址。

    例如:一种单地址指令的结构如下所示,其中用X I D各字段组成该指令的操作数地址。

    二、寻址方式

    1、隐含寻址(操作数在累加寄存器中)

    在指令中不明显的给出而是隐含着操作数的地址

    例如:单地址的指令格式,没有在地址字段指明第二操作数地址,而是规定累加寄存器AL或AX作为第二操作数地址,AL或AX对单地址指令格式来说是隐含地址

    eg: MOV AL ,LSRC_BYTE

          MUL RSRC_BYTE  

    ADD 寻址特征 A

    操作数地址隐含在操作码中,(寻址特征指明寻址类型)。

    另一个操作数隐含在ACC中 

    先在内存中地址为A的地方找到一个操作数,另一个操作数隐含在寄存器ACC里,从ACC里取出另外一个操作数,然后和给出的A地址中的数相加暂存在ACC中。

    2、立即寻址

    形式地址A就是操作数本身

    OP 立即寻址特性 # A
    • 指令执行阶段不访存
    • A的位数限制了立即数的范围

    3、直接寻址

    EA=A

    直接根据读内存找到操作数,形式地址不需要经过任何处理。

    • 执行阶段访问一次存储器
    • A的位数决定了该指令操作数的寻址范围

    MOV AX,[2222H]:将有效地址为2222H的内存单元的内容读到累加器AX中

    4、间接寻址

    EA=(A)

    有效地址由形式地址间接提供,形式地址是操作数的地址的地址

    OP 间接寻址标识   A

    根据A的内容到内存中寻找到的是操作的数地址,再根据这个地址去找操作数。

    • 执行指令阶段2次访存
    • 可扩大寻址范围

    5、寄存器寻址

    EA=R1

    形式地址是寄存器的编号,直接去寄存器中寻址操作数。

    • 执行阶段不访存,只访问寄存器,执行速度快

    6、寄存器间接寻址

    操作数里存放的是寄存器的编号,寄存器中存的不是操作数而是操作数的有效地址。所以操作数在存储器里。

    • 有效地址在寄存器中,操作数在存储器中,执行阶段访存。

    7、偏移寻址

    一种强有力的寻址方式  EA=A+(R)    形式地址需要和另一个寄存器中的地址相加

    形式地址A是显示的

    另一个地址字段隐含在某个专用的寄存器R中。

    常用的三个偏移寻址方式是:相对寻址  基址寻址  变址寻址(根据寄存器的不同类型来区分的)

    7.1 相对寻址

    A是相对于当前指令的位移量(可正   可负  补码)

    EX=A+(PC)    ----PC程序计数器  PC存储当前正在执行指令的地址 

    • A的位数决定操作数的寻址范围

    7.2、基址寻址

    EA=A+(BR)   BR为基地址寄存器  (Base Register)

    • 可扩大寻址范围

    7.3、变址寻址

    EA=A+(IX)  IX为变址寄存器(专用)  通用寄存器也可以作为变址寄存器

     

    • 可扩大寻址范围
    • 在程序执行的过程中IX内容可变,形式地址A不变
    • 便于处理数组问题

    8、堆栈寻址

    例:某16位机器所使用的指令格式和寻址方式如下所示,该机有两个20位基址寄存器,4个16位变址寄存器,十六个16位通用寄存器,指令汇编格式中S(源),D(目标)都是通用寄存器。M是主存中的一个单元。三种指令的操作码分别是MOV(OP)=(A)h ,STA(OP)=(1B) LDA(OP)=3C)h   MOV是传送指令,STA为写数指令 LDA为读数指令

    要求:1、分析三种指令的指令格式和寻址方式特点

    2、CPU完成哪一种操作锁化时间最短?哪一种操作所花时间最长,第二种指令的执行时间有时会等于第三种指令的执行时间吗?

    3、下列情况下每个十六进制指令分别代表什么?如果有编码不正确,如何改进才能成为合法指令?

    1. (F0F1)H(3CD2)H               ---32位   
    2. (2856)H                               --16位
    3.    (6FD6)H                           --16位
    4. (IC2)H                                --16位

    答:1、MOV:单字长,二地址指令属于RR指令  

           STA:双字长,二地址指令,RS指令  S为基址寄存器或变址寄存器

           LDA:双字长,二地址指令,RS指令 S为20位地址。

    2、MOV单字长取出只需要一次访存,第一个不访问存储器要快。第二种还需要计算有效地址并对存储器进行访问。第二种指令所花费的时间不等于第三种,第三种无需进行有效地址的计算。

    3、根据条件。MOV(OP)=(A)h=001010 

      STA(OP)=(1B)h =011011

    LDA(OP)=(3C)h=111100

    (F1F1)h(3CD2)h=(1111 0000 1111 0001 0011 1100 1101 0010)b

    正确,表明吧主存(13cd2)h地址单元的内存取至15号寄存器

    (2856)H=(0010 1000  0101 0110)b  单字长指令表明吧寄存器6的内容传送到寄存器5号

    (6FD6)H=0110 1111 1101 0110b操作码不对  应修改为(28D6)h

    (1C2)H=00000001 1100 0010b操作码不对 应修改为(28C2)h

    三、CISC何如RISC

    复杂性指令系统计算机和精简型指令系统计算机

    1、精简指令系统:选取使用频率最高的一些简单指令,指令条数少,   长度固定,指令少。

     例:在SPARC中,有一些指令没有选入指令系统,但很容易使用指令集中的另外一条指令来替代实现

    下表左半部列出了6条指令的功能,请在表的右半部填入替代指令及实现方法

    答:因为SPARC约定R0的内容恒为0,而且立即数可以作为一个操作数来处理,所以某些指令可以替代实现。

    指令   功能  替换指令 实现方法
    MOVE 寄存器间传送数据 ADD Rs+R0->Rd
    INC 寄存器内容加1 ADD 立即数imm13=1,作为操作数
    DEC 寄存器内容减1 SUB 立即数imm13=-1 作为操作数
    NEG 取负数 SUB R0-Rs->Rd
    NOT 取反码 XOR 立即数imm13=-1 作为操作数
    CLR 清除寄存器 ADD R0+R0=Rd

    例、一条指令存储在存储器中的地址为300的地方,其操作数地址字段为301,地址字段的值为400,处理器中寄存器R1中包含数据200,在以下指令寻址方式下,求操作数的有效地址。

    1)直接寻址

    2)立即数寻址

    3)相对寻址

    4)寄存器(R1)间接寻址

    5)以R1为变址寄存器的变址寻址

    300中是操作码  301是地址码说明占两个地址

    答、1)400

    2) 400是数本身 其地址是301

    3)PC+400

    4)寄存器间接寻址,寄存器里存的就是有效地址200

    5)以R1为变址寄存器的变址寻址:操作数的有效地址为=200+400

    格式表明有8个通用寄存器(产后度为16位),X指定寻址方式,主存实际容量为156K字。

    1)假设不用通用寄存器也能直接访问主存中的每一个单元,并假设操作码域OP=6为,请问地址码域应

    分配多少位?指令字长度应有多少位?

    2)假设X=11时,指定的某个通用寄存器用做基址寄存器,请提出一个硬件设计规则,使得被指定的通用寄存器能访问1M主存空间中的每一个单元

    答:1)主存容量为256K 地址域码为18位,指令的长度为6+2+3+18=32位

    2)1M需要20位地址

    此时指定的通用寄存器用做基址寄存器,长度为16位,不能覆盖1M字空间,可采用基址寄存器左移4位,低位补0,形参20位的基地址,然后与质量字形式地址相加得到有效地址,可以访问1M字空间的任意一个单元。

    例:假设寄存器中R中的数值为1000,地址为1000的寄存器中存储的数据为2000,地址2000的存储器中存储的数据为3000,问在以下寻址方式中访问的指令操作数的值是什么?

    1)寄存器寻址R   

    寄存器寻址,寄存器中的值就是操作数所以值为1000

    2)寄存器间接寻址(R)

    R中存的是地址,所以数据是2000

    3)直接寻址1000

    形式地址是1000,操作数是2000

    4)存储器的间接寻址(1000)

    地址1000中存放的2000是形式地址 2000中存放的才是数据,所以操作数是3000

    5)立即数寻址 #2000

    立即寻址里面存放的就是操作数本身,所以操作数是2000

    例、某计算机字长为16位,主存地址空间大小为128k,按字编址,采用单字长指令格式,指令各字段定义如下

    转移指令采用相对寻址,相对偏移是用补码表示,寻址方式定义如下

    Ms/Md 寻址方式 助记符 含义
    000B 寄存器直接 Rn 操作数=(Rn)
    001B 寄存器间接 (Rn) 操作数等于((Rn))
    010B 寄存器间接。自增 (Rn)+ 操作数=((Rn)) (Rn)+1->Rn
    011B 相对 D(Rn) 转移目标地址=(PC)+(Rn)

    (X)表示有存储地址X或寄存器X的内容

    1)该指令系统最多可有多少指令?该计算机最多有多少个通用寄存器?存储地址的寄存器(MAR)和存储数据的寄存器(MDR)至少各徐多少位?

    答:操作码有4位所以指令最多有1的四次方16条指令,

    指令操作数占6位,其中3位指示寻址方式,寄存器编号为3位,所以该计算机最多可有2的三次方也就是8个通用寄存器

    计算机字长16位,所以存储器寄存器(MDR)至少为16位。

    主存空间为128KB,按字(16位)编址,则寻址范围为0~64K 存储器地址寄存器(MAR)需16位(2的16次方=64K)

    2)转移指令的目标地址范围是多少?

    答:16位计算机通用寄存器也是16位,则指令中寻址范围至少可达0~2的16次方-1

    另一方面,主存地址空间为2的16次方(64K)则寻址范围也应该大于等于64K,故转移指令的目标范围为0~2的16次方-1

    3)若操作码0010B表示加法操作(助记符为add),寄存器R4和R5的编号分别为100B和101B,R4的内容为1234H,R5的内容为5678H,地址1234H的内容为5678H,5678H中的内容为1234H,则汇编语言为add(R4),(R5)+

    对应的机器码是什么(十六进制)?该指令操作执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?

    答:R4是间接寻址  R5是间接寻址+自增

    操作码         源寻址方式      源寄存器       目标寻址方式               目标寄存器

    0010                 001                100                    010                                  101  

    该指令的功能是将R4内容所指存储器单元的内容(源)与R5内容所指存储器单元(目标)的内容相加后,写到R5内容所指的存储器单元,即

    R4的内容:1234H,R4内容所指存储器单元内容:5678H

    R5的内容:5678H,R5内容所指存储器单元内容:1234H

    目标寄存器R5自加:5678H+1=5679H

    所以执行后,目标寄存器R5目标寄存器内容所指的存储器单元将改变,新R5=5679H

    R5所指存储单元(地址5678H的内容)=68ACH

    例:某机器字长16位,主存按字节编址,转移指令草原相对寻址,由两个字节组成,第一字节为操作码字段,第二字节为相对位移量字段,假定取指令时,每取一个字节PC自动+1,若某转移指令所在主存地址为2000H,相对位移量字段的内容为06H,则该转移指令成功转以后的目标地址是

    A:2006H   B2007H C:2008H D:2009H

    答:1个字节8位,机器字长16位  转移指令占2个字节, 读操作码是PC+1=2001   读偏移地址又+1变为2002H ,用2002和偏移量06相加,得2008H 选D

  • 相关阅读:
    从汇编看c++中的placement operator new
    从汇编看c++的new和delete
    从汇编看c++中全局对象和全局变量
    javascript中的this
    好工具
    js压缩解压工具
    IE的documentMode属性
    77. sqlserver 锁表解决方式
    75. ID重新走过,备份表
    5. Java中序列化的serialVersionUID作用
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/11599855.html
Copyright © 2020-2023  润新知