最近在学习 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
|
寄存器寻址
存储器寻址方式
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]
|