当前位置: 首页 > 编程 > 正文

一.寻址方式 8086CPU一共有7种寻址方式,不同的寻址方式,有不同的指令周期,选择合适的寻址方式,可优化指 […]

一.寻址方式

  • 8086CPU一共有7种寻址方式,不同的寻址方式,有不同的指令周期,选择合适的寻址方式,可优化指令,减少指令周期,提高效率.

  • 所谓寻址方式,其实也就是寻找操作数的方式.(操作数从哪里来)

  • 操作数采用哪种寻址方式,会影响机器运行的速度和效率.

1.1 立即数寻址

简介

  • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后.(操作数作为指令的一部分存放在操作码之后的主存单元中).
MOV AL,05H    ;AL <- 05H
MOV AX,0102H  ;AX <- 0102H

寻址流程

  • 立即数寻址(以 MOV DX,1234H 为例)
  1. 先取出CS段寄存器地址,然后取出IP偏移地址,经过地址加法器算出20位物理地址,经过输入输出控制电路,寻找对应的物理地址,取出指令B8,送到指令队列缓冲器等待,然后 IP+1,重复取指令.

  2. EU中的执行部分电路控制从指令队列缓冲器首部取出B8,对B8进行译码.译码完成(知道是MOV 指令,知道寻址方式,但缺少操作数)之后等待操作数,因为此时缺少信息,步骤1同步进行取指令活动.

  3. 当步骤1得到新的地址取出操作数34H时,会经过指令队列缓冲器将34H放到BIU部分的内部暂存器中,此时指令仍不完整,当取出12H时,继续经过指令队列缓冲器放到BIU部分的内部暂存器中,此时指令完整.将数据1234H从BIU内部暂存器移动到BX中,该指令执行完毕.

1.2 寄存器寻址

简介

  • 操作数存放在CPU的内部寄存器REG中,可以是:
    8位寄存器r8:
    AH AL BH BL CH CL DH DL
    16位寄存器r16:
    AX BX CX DX SI DI BP SP
    4个段寄存器seg:
    CS DS SS ES
MOV BX,AX

寻址流程

  • 寄存器寻址(以MOV DS,AX为例)
  1. 先取出CS段寄存器地址,再取出IP偏移地址,经过地址加法器算出20位物理地址,再经过输入输出电路,寻找对应的物理地址,取出指令,送到指令队列缓冲器等待,然后IP +1 ,重复之前步骤取指令.

  2. EU中的执行部分电路控制从指令队列缓冲器首部取出8E,对8E进行译码,译码完成(知道是个MOV指令,知道寻址方式,但缺少操作数)之后会等待操作数,因为此时缺少信息,步骤1同步进行取指令活动.

  3. 译码完成,AX中的数据被放入内部暂存器,然后BIU部分将内部暂存器中的数据放到DS中,该指令执行完毕.

1.3 直接寻址

简介

  • 有效地址在指令中直接给出

  • 默认的段地址在DS段寄存器,可使用段超越前缀改变

MOV AX,[2000H]
; AX <- DS:[2000H]
; 指令代码: A10020

MOV AX,ES:[2000H]
; AX <- ES:[2000H]
; 指令代码: 26A10020

寻址流程

  • 主存直接寻址(以 MOV AX,[2000H]为例)
  1. 先取出CS段寄存器地址,再取出IP偏移地址,经过地址加法器中算出20位物理地址,经过输入输出电路,寻找对应的物理地址,取出指令 B8,送到指令队列缓冲器等待,然后 IP + 1,重复之前取指令.

  2. EU中的执行部分电路控制从指令队列缓冲器首部取出A1,对A1进行译码,译码完成(知道是MOV 指令,知道寻址方式,但缺少操作数),之后会等待操作数,因缺少信息,步骤1同步进行取指令操作.

  3. 步骤1相继取出00H 和20H ,并把它们从指令队列缓冲器中存到内部暂存器,然后,把这个内部暂存器当作偏移地址,联合DS,算出20位物理地址.

  4. BIU部分通过外部总线,将物理地址中连续两个字节直接送到BIU内部暂存器中.

  5. 内部暂存器中的数据送到AX寄存器中,该指令执行完毕.

1.4 寄存器间接寻址方式

简介

  • 有效地址存放在基址寄存器BX或变址寄存器SI,DI中.

  • 默认的段地址在DS段寄存器,可使用段超越前缀改变.

MOV AX,[SI]  ; AX <-DS:[SI]

寻址流程

  • 以 MOV AX,[BX]为例.
  1. 先取出CS段寄存器地址,再取出IP偏移地址,经过地址加法器中算出20位物理地址,再经过输入输出电路,寻找对应的物理地址,取出指令8B,送到指令队列缓冲器等待,然后IP+1,重复之前取指令.

  2. EU中执行部分电路控制从指令队列缓冲器首部取出8B,对8B进行译码,译码完成,(知道是个MOV 指令,知道寻址方式,但缺少操作数).之后会等待操作数,因为此时缺少信息,步骤1 同步进行取指令活动.

  3. 对8B进行译码,经过步骤1,拿到07H译码,然后EU部分将SI的内容(2000H)进入BIU的内部暂存器中,然后,把这个内部暂存器当作偏移地址,联合DS,算出20位物理地址.

  4. BIU部分通过外部总线,将物理地址中连续两个字节直接送到BIU的内部暂存器中.

  5. 内部暂存器中的数据送到AX寄存器中,该指令执行完毕.

1.5 寄存器相对寻址

简介

  • 有效地址是寄存器内容与有符号8位或16位偏移之和,寄存器可以是BX,BP或SI,DI
有效地址 = BX/BP/SI/DI + 8/16偏移
  • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS,可用段超越前缀改变.
MOV AX,[DI+06H]
    ;AX←DS:[DI+06H]
MOV AX,[BP+06H]
    ;AX←SS:[BP+06H]

寻址流程

  • 以 MOV AX,[SI+6] 为例
  1. 先取出CS段寄存器地址,再取出IP偏移地址,经过地址加法器算出20位物理地址,再经过输入输出电路,寻找对应的物理地址,取出指令8B,送到指令队列缓冲器等待,然后IP + 1,重复之前取指令.

  2. EU执行部分电路控制从指令队列缓冲器首部取出8B,对8B进行译码,译码完成.(知道是MOV指令,知道寻址方式,但缺少操作数).之后会等待操作数,因缺少信息,步骤1同步进行取指令操作.

  3. 步骤1.取出指令4D.

  4. DI中的内容送到ALU中,同时06进入BIU的内部暂存器最后进入ALU中.

  5. DI和06再ALU中进行加法运算,结果放到BIU的内部暂存器中.

  6. BIU将DS和内部暂存器中的数据联合使用,计算出一个20位物理地址.

  7. BIU通过外部总线从内存中获取一个字的数据并直接放到内部暂存器中.

  8. 内部暂存器中的数据送到CS,指令执行完毕.

1.6 基址变址寻址

简介

  • 效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
  • 址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
MOV AX,[BX+SI]    
    ;AX←DS:[BX+SI]
MOV AX,[BP+DI]
    ;AX←SS:[BP+DI]
MOV AX,DS:[BP+DI]
    ;AX←DS:[BP+DI]

寻址流程

  • 以 MOV CX,[BX+SI] 为例:
  1. 先取出CS段寄存器地址,再取出IP偏移地址,经过地址加法器算出20位物理地址,再经过输入输出电路,寻找对应的物理地址,取出指令8B,送到指令队列缓冲器等待,然后IP + 1,重复之前取指令.

  2. EU执行部分电路控制从指令队列缓冲器首部取出8B,对8B进行译码,译码完成.(知道是MOV指令,知道寻址方式,但缺少操作数).之后会等待操作数,因缺少信息,步骤1同步进行取指令操作.

  3. EU部分从指令队列缓冲器头部取出08,对08进行译码,此时译码完成.

  4. BX和SI的数据被送到ALU中进行计算.

  5. ALU计算的结果放到BIU内部暂存器中.

  6. BIU将DS和内部暂存器中的数据联合使用,计算出一个20位物理地址.

  7. BIU通过外部总线从物理地址中取出数据放到内部暂存器中.

  8. 内部暂存器中的数据送到CX中,指令执行完毕.

1.7 相对基址变址寻址

简介

  • 效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
有效地址=BX/BP+SI/DI+8/16位位移量
  • 址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
MOV AX,[BX+SI+06H]
    ;AX←DS:[BX+SI+06H]

寻址流程

  • 以 MOV CX,[BX + SI + 06] 为例
  1. 先取出CS段寄存器,再取出IP偏移地址,经过地址加法器中算出20位物理地址,在经过输入输出电路,寻找对应的物理地址,取出指令8B,送到指令队列缓冲器等待,然后IP + 1 ,重复之前取指令.

  2. EU的执行部分电路控制从指令队列缓冲器首部取出8B,对8B进行译码,译码完成.(知道是MOV指令,知道寻址方式,但缺少操作数).之后会等待操作数,因缺少信息,步骤1同步进行,取出指令48.

  3. EU部分从指令队列缓冲器首部取出48,对48进行译码,此时译码完成.

  4. BX和SI的数据被送到ALU中进行计算.

  5. ALU中计算BX + SI.

  6. 06通过指令对了缓冲器进入内部暂存器.

  7. 06从内部暂存器进入ALU.

  8. ALU将现有的结果和06相加,并把计算结果放到内部暂存器中.

  9. BLU将DS和内部暂存器中的数据联合使用,计算出一个20位物理地址.

  10. BIU通过外部总线从物理地址中取出数据直接放到内部暂存器中.

  11. 内部暂存器中的数据送到CX中,指令执行完毕.

本文固定链接: https://blog.050k.com/?p=164 | LseKit's Blog
标签:,

04_16汇编_寻址方式:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter