0%

8086指令基础 - 寻址方式

最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。

运行环境:

  • 操作系统: Windows 10家庭版
  • 编译器:Windows XP Debug

8086寻址方式

8086机器代码有三种寻址方式:

  • 立即数寻址
  • 寄存器寻址
  • 存储器寻址
1
2
3
;操作码		目的操作数		源操作数
mov ax, bx

1
2
3
4
5
6
0B26:0100 89D8          MOV     AX,BX
0B26:0102 89D0 MOV AX,DX
;mov指令的操作码是89
D8 = 11 011 000
C0 = 11 000 000
寻址方式 目的操作 源操作数

立即数寻址

  • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后
  • 这种操作数被称为立即数(imn)
    • 它可以是8位数值i8(00H~FFH)
    • 也可以是16位数值i16(0000H~FFFFH)
  • 立即数寻址方式常用来给寄存器赋值
1
2
0B26:0100 B005          MOV     AL,05		;al<--05H
0B26:0102 B80500 MOV AX,0005 ;ax<--0005H

寄存器寻址

1
2
MOV AX,1234H
MOV BX,AX

存储器寻址方式

8086设计了多种存储器寻址方式

直接寻址方式

有效地址在指令中直接给出
默认的段地址在DS段寄存器可使用段超越前缀改变

1
2
3
4
5
6
7
MOV AX,[2000H]
;AX←DS:[2000H]
;指令代码:A10020

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

寄存器间接寻址方式

段地址对应BX/SI/DI寄存器默认是DS对应BP寄存器默认是SS;可用段超越前缀改变有效地址=BX/BP/SI/DI+8/16位位移量

1
2
3
4
MOV AX,[DI+06H]
;AX←DS:[DI+06H]
MOV AX,[BP+06H]
;AX←SS:[BP+06H]

基址变址寻址方式

段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变有效地址=BX/BP+SI/DI

1
2
3
4
5
6
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]

相对基址变址寻址方式

段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变有效地址=BX/BP+SI/DI+8/16位位移量

1
2
3
4
5
6
7
8
MOV AX,[BX+SI+06H]
;AX←DS:[BX+SI+06H]

;还可以用符号表示位移量
MOV AX,[SI+COUNT]
;COUNT是事先定义的变量或常量(就是数值)
MOV AX,[BX+SI+WNUM]
;WNUM也是变量或常量

多种表达形式

1
2
3
4
5
6
7
MOV AX,[BX][SI]
;等同于 MOV AX,[BX+SI]
MOV AX,COUNT[SI]
;等同于 MOV AX,[SI+COUNT]
MOV AX,WNUM[BX][SI]
;等同于 MOV AX,WNUM[BX+SI]
;等同于 MOV AX,[BX+SI+WNUM]