汇编(三)——8086的寻址方式

令由操作码和操作数两部分组成。操作码说明计算机要执行哪种操作,是指令中不可缺少的部分。操作数是指令执行的参与者,即各种操作对象。

 

用助记符表达的指令格式通常为:
操作码   操作数1,操作数2            ;注释
双操作数中,操作数2称为源操作数,操作数1称为目的操作数。
一、8086的机器代码格式
8086的机器代码(Machine Code)格式,操作码占1个或2个字节,后面的各个字节知名操作数。其中“mod reg r/m”字节表明殉职操作数的方式,“位移量”字节给出某些寻址方式需要的对基地址的偏移量,“立即数”字节给出立即寻址方式需要的数值本身。如下图
指令代码格式
代码指令一般占用1~6个字节,细分如下:
指令代码详细格式

其详细的通用指令格式如图:
指令代码格式

其中第一字节称为操作码字节。
2~7位为操作码(OPCODE),第1位称为D位,指出操作数传输的方向,D=0时,表示第2字节REG字段(第2字节3~5位)给出的寄存器为源操作数寄存器。D=1时,REG字段指出的寄存器为目标操作数。第一字节第0位为W位,指出操作数是字节还是字。W=0表示参加运算的数为字节,W=1表示参加运算的数为字。

8086指令的寻址方式字节编码:
寻址方式字节编码

二、寻址方式
1、立即数寻址方式——指令中的操作imm直接存放在极其代码中,紧跟在操作码之后。例:MOV AL,05H
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 AX,1234H     ;源操作数采用寄存器寻址,目的操作数为立即数寻址
    MOV BX,AX        ;两个操作数均为寄存器寻址
3、存储器寻址方式——寻址贮存中存储的操作数称为存储器寻址方式,也称为主存寻址方式。在这种寻址方式下,指令中给出的是有关操作数的主存地址信息。因为8086的存储器是分段管理的,这里给出的地址只是偏移地址(称为有效地址EA),段地址在默认的或是用段超越前缀指定的段寄存器中。主要有以下几种方式:
(1)直接寻址:指令中直接包含了有效地址。例:MOV AX,[2000H]     ;AX←DS:[2000H],该指令中给定了有效地址2000H,默认的段寄存器是DS数据段。
(2)寄存器间接寻址方式:有效地址存放在基址寄存器BX或变址寄存器SI、DI中,默认的段地址在DS段寄存器中,可以使用段超越前缀改变。例:MOV AX,[SI]     ;AX←DS:[SI]。该指令中有效地址存放于SI寄存器中。
(3)寄存器相对寻址方式:有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI。操作数的有效地址应该是:有效地址EA=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]
(4)基址变址寻址方式:把一个基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成有效地址EA。有效地址EA=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]
(5)相对基址变址寻址方式:也使用基址寄存器(BX/BP)和变址寄存器(SI/DI),另外还在指令中制定一个8位或16位的位移量,这三者之和构成操作数的有效地址EA。
有效地址EA=BX/BP+SI/DI+8/16位位移量   ,与BX寄存器默认的是数据段DS,与BP寄存器默认的是堆栈段SS,例:MOV AX,[BX+SI+06H]     ;AX←DS:[BX+SI+06H]

说明:
1、在寄存器相对寻址或相对基址变址寻址方式中,位移量可以使用符号表示:
MOV AX,[SI+COUNT]     ;COUNT是事先定义的变量或常量,此处就是一个数值
MOV AX,[BX+SI+WNUM]   ;WNUM也是常量或变量
2、同一寻址方式有时可以写成不同的方式:
MOV AX,[BX][SI]       ;也可以写成:MOV AX,[BX+SI]
MOV AX,COUNT[SI]      ;也可以写成:MOV AX,[SI+COUNT]
MOV AX,WNUM[BX][SI]   ;也可以写成:MOV AX,[BX+SI+WNUM] 或 MOV AX,WNUM[BX+SI]

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值