8086指令的寻址方式

8086指令的寻址方式

author: fengclchn@outlook.com
date: 09/26/2021

基本规定

  • 8086为CISC机器,指令字长不一定
  • 8086双操作数指令至少有一个为寄存器寻址或立即寻址
  • 根据寻址方式计算而得的地址只是有效地址EA——段内偏移地址(与计算机组成原理的有效地址定义不一样,计组中有效地址指物理地址),这一地址还需要与所在段的段基址组合后才能形成20位物理地址

部分名词

  • EU(Execution Unit):执行部件
  • BIU(Bus Interface Unit):总线接口部件

立即寻址(Immediate Addressing)

  • 指令直接给出操作数的数值
  • 指令机器码的最后1个或2个直接就是操作数——立即数
  • 汇编指令中可使用
    • 十六进制数(H)
    • 二进制数(B)
    • 十进制数(不加特殊符号)
    • 由撇号'括起来的ASCII码表达的字符和字符串
  • 立即数直接从指令中取得,取数速度较快
  • 常用于给寄存器或存储器赋初值

注意

  • 立即数只能作为源操作数
  • 立即数的位数不固定,由目的操作数确定操作数的位数
  • 如果是十六进制数以字母 A~F 打头,则必须在前面加上一个 “0”,否则会被识别为标识符
MOV BL, 5
MOV AX, 3064H
MOV AX, 0FFFFH

寄存器寻址(Register Addressing)

  • 操作数在寄存器中
  • 寄存器的内容就是操作数的数值
  • 汇编指令中操作数用寄存器的符号来表示
INC AX ;AX+1→AX
  • 寄存器寻址既可用于源操作数,也可用于目的操作数
MOV AX, BX
  • 位数可以为16位也可以为8位,由寄存器的位数决定
    • 16位:AX/BX/CX/DX/SI/DI/SP/BP
    • 8位:AL/AH/BL/BH/CL/CH/DL/DH
  • 此类指令机器码字节最短,因为8个通用寄存器只要3个代码即可区分
  • 由于寄存器在微处理器芯片的内部,整个操作都在微处理器内部进行,不必执行访问内存的总线周期,因此其执行速度最快
MOV	BL, 5

存储器寻址(Memory Addressing)

  • 操作数在存储器中
  • 在指令操作中,存储器操作数出入微处理器都需要经过总线
  • 当EU读或写一个存储器操作数时,必须将一个偏移地址(Offset Address)送给BIU,BIU经过地址运算后产生一个20位的物理地址,然后执行存取该操作数所需的总线周期。
  • EU为一个存储器操作数,而计算出来的偏移量称为操作数的有效地址EA(16位无符号数),表示该操作数所在存储单元与所在段起始地址的距离(以字节为单位)
  • 段起始地址存在DS中,更改可通过添加段跨越前缀实现
  • EA=基址寄存器/变址寄存器/DISP,三者组合而得
  • 位移量(Displacement,DISP)8位或16位数,包含在指令中,根据程序中操作数名称(变量或符号)的为知推算而得,程序员可以修改或规定此值
  • EA的形成方法如下:

直接寻址(Direct Addressing)

  • 由指令直接给出操作数的偏移地址,紧跟在操作码之后
INC BYTE PTR [043AH]  ;存储器操作数偏移地址位4A3H
  • 另一种表示形式,使用变量
INC ADDR  ;指令中存储器操作数的地址用符号地址(变量,Variable)ADDR表示
  • 默认段地址由DS指明,可通过添加段跨越前缀进行更改
MOV AX, ES: VALUE ;VALUE为变量名

寄存器间接寻址(Register Indirect Addressing)

  • 指存储器操作数的有效地址直接取自一个基址寄存器(BX或BP)或变址寄存器(SI或DI)
  • 操作数在主存中,操作数的EA在寄存器中
  • 寄存器间接寻址方式的地址码为寄存器的编号
MOV AX, [BX]
INC BYTE PTR [BX]
  • 只有BX,BP,SI,DI可用于寄存器间接寻址
    • 若寄存器为BX/SI/DI,则段地址由DS指明
    • 若寄存器为BP,则段地址由SS指明
    • 如有需要可以通过段跨越前缀指定其他段
MOV AX,ES: [BX] ;通过段跨越前缀指定段寄存器为ES

寄存器相对寻址(Register Relative Addressing)

  • 基址寻址和变址寻址又称为寄存器相对寻址
  • 操作数在主存中
  • 操作数的EA为寄存器的内容和一个带符号的8位(或16位)位移量之和
  • 只有BX,BP,SI,DI可以用于寄存器相对寻址
    • 若寄存器为BX/SI/DI,则段地址由DS指明
    • 若寄存器为BP,则段地址由SS指明
    • 如有需要可以通过段跨越前缀指定其他段
MOV	DL, ES: STRING[DI] ;通过段跨越前缀指定段寄存器为ES
基址寻址(Based Addressing)
  • 指以基址寄存器BX或BP的内容为基准地址

  • 指令中再给出一个地址位移量D(D8或D16)

  • 两种表示

    • [BX(或BP)+D] D为常量

      INC BYTE PTR [BP+4]
      
      MOV AX, [COUNT + BX]
      
    • D[BX(或BP)] D为常量或变量。当D为变量时,地址使用的是变量本身的地址,而不是变量存储的值

      INC ADDR[BX]
      
      MOV AX, COUNT[BX]
      
  • 当使用BP作基址寻址时,若无指定段替换,则内定在堆栈段内寻址

  • 若D为常量,则以有符号的二进制数表示,可为8位或16位值。当D位8位值时,有效地址计算中,位移量必须进行符号扩展

变址寻址(Indexed Addressing)
  • 指指令中给出一个位移量D作为基准地址,再同变址寄存器SI(或DI)的内容相加作为存储器操作数的有效地址
  • 两种表示,D含义同基址寻址
    • [si(或DI)+D]
    • D[SI(或DI)]
MOV	AX, [SI + 06H]

基址变址寻址(Based Indexed Addressing)

  • 指基址寄存器BX(或BP)中存放基准地址

  • 变址寄存器SI(或DI)存放变址值

  • 指令中再给出一个位移量D

  • 三者相加构成存储器操作数的有效地址

  • D可以位8位数或16位数,也可以无此项

  • 若为8位数,在计算中应进行符号扩展

  • 两种表示

    • [BX(或BP)+SI(或DI)+D]
    INC BYTE PTR [BX+DI+4]
    
    • D[BX(或BP)+SI(或DI)]
    INC ADDR[BX+DI]
    
  • 也可写成

    MOV AX, [BX][SI]
    INC ADDR[BX][DI]
    
  • 含有D项的基址变址寻址又称为相对基址变址寻址(Relative Based Indexed Addressing)

  • 若基址寄存器采用BX,则段地址由DS指明

  • 若基址寄存器采用BP,则段地址由SS指明

  • 如有需要可通过段跨越前缀指定其他段

    MOV CX, ES: [BX][SI]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值