首先要思考,操作数可以存在什么地方
1.操作数位于指令代码中,编译的时候就得到了这个操作数,这就是立即(数)寻址。这个操作数以常量的形式出现。
2.操作数位于处理器内部的寄存器中,处理器直接从寄存器或的操作数,这就是寄存器寻址方式。
3.操作数位于内存,要从内存单元获取操作数,叫做储存器寻址。8086/8088处理器的主存地址在程序设计时采用逻辑地址。逻辑地址分成段地址和偏移地址两部分。存储器寻址方式表达存储器地址时,段地址在默认的或段超越前缀指令指定的段寄存器中,偏移地址被称为有效地址EA(Effective Address)。有效地址用中括号括起来。
1.内存地址直接给出,如常数和变量名。存在指令代码中,就是直接寻址
1 2 |
MOV AX,[0001H] MOV AX,BUF |
2.内存地址在寄存器里面,叫做寄存器间接寻址。
1 |
MOV AX,[BX] |
如果BX的内容是0001h 那么和
1 |
MOV AX,[0001H] |
是一样的
3.内存地址是两部分的和,一部分在寄存器,一部分是直接给出的(成为位移量),这就是寄存器相对寻址
BUF为变量名,他代表的是它的偏移地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
.386 DATA SEGMENT USE16 A DB '012345' BUF DB '0123456789' DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,2 MOV AX,[BX+5] MOV AL,[BX+BUF] MOV AL,BUF[BX] MOV AH,4CH INT 21H CODE ENDS END START |
汇编之后
4.内存地址是两部分的和,一部分在基址寄存器,一部分在变址寄存器。这就是基址加变址寻址
1 |
MOV AX,[BX+DI] |
5.内存地址是三部分的和,一部分是基址寄存器,第二部分是变址寄存器,第三部分是位移量。叫做相对基址加变址寻址
1 2 3 4 |
MOV AX,[BX+DI+BUF] MOV AX,BUF[BX][DI] MOV AX,[BX+DI+3] MOV AX,3[BX][DI] |
举例
只有一个常量—1234h—立即寻址
只有一个寄存器名—AX—寄存器寻址
其他——存储器寻址
【常量】—23H—直接寻址
【寄存器名】—[BX]—寄存器间接寻址
【寄存器+ 常量】—[BX+BUF]—寄存器相对寻址
【寄存器+寄存器】—[BX+DI]—基址加变址
【寄存器+寄存器+常量】—[BX+DI+4]—相对基址加变址寻址
变量名 —BUF— 直接寻址
变量名+常量—BUF+5—直接寻址
变量名【寄存器】—BUF[BX]—寄存器相对寻址
offset 变量名——立即寻址
关于位移量
位移量直接给出 ,也可以是变量 标号 和数值 的和
1 |
MOV AX,BUF+2[DI] |
BUF+2 相当于位移量