指令寻址
首先要知道程序指令是存放在内存中的
- 顺序寻址
取完一条指令后,顺序去取下一条指令,由程序计数器PC+1形成下一条指令的地址
1是指一条指令字的长度,不同机器不同 - 跳跃寻址
下一条指令的地址由转移指令的地址码字段给出
例如jmp指令,call指令。。。
数据寻址
-
立即寻址
操作数的值保存在指令本身中,而不是使用内存中的操作数
MOV AX,1234H
-
寄存器寻址
操作数在寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP和BP;
对于8位操作数,寄存器可以是AL,AH, BL, BH, CL, CH, DL,DH;
对千386及其后继机型还可以有32位操作数,寄存器可以是EAX,EBX,ECX, EDX, ESI, EDI, ESP和EBP。
这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以得到较高的运算速度。
(BX)=1234H
MOV AX,BX
以下各种寻址方式的操作数都在除代码段以外的存储区中
EA = 基址 + (变址 * 比例因子)+ 位移量
- 直接寻址
指令直接给出操作数的有效地址
MOV AX,[1234H]
默认在DS段
MOV AX,DS:[1234H]
MOV ES:[1234H],AX
可加段跨越前缀
MOV AX,VALUE <=> MOV AX,[VALUE]
可用符号地址代替数值地址 - 寄存器间接寻址
操作数在存储器中,操作数的有效地址用基址寄存器或变址寄存器来指定
16位寻址时
可用的寄存器有BX,BP,SI,DI
32位寻址时
可用EAX,EBX. ECX, EDX, ESP, EBP, ESI和EDI等8个通用寄存器。
规定:凡使用BP,ESP和EBP 时 ,其默认段为SS 段。 其他寄存器的默认段为DS 寄存器
MOV AX, [BX]
(DS)=2000H, (BX)=1000H
物理地址=20000H+1000H= 21000H
- 寄存器相对寻址(直接变址寻址)
操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位移量之和
MOV AX, COUNT[SI] <=> MOVAX, [COUNT+SI]
其中COUNT为16位位移量的符号地址
(DS)=3000H (SI)=2000H COUNT=3000H
PA = 30000H + 2000H + 3000H = 35000H
-
基址变址寻址
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和
MOV AX,[BX][DI] <=> MOV AX, [BX+DI]
(DS)=2100H, (BX)=0158H, (DI)=10A5H
=>EA=0158 + 10A5=11FDH
物理地址=21000+11FD=221FDH
执行结果(AX)=1234H
-
相对基址变址寻址方式
操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中指定的位移
量之和
MOV AX, MASK[BX][SI] <=> MOV AX, MASK[BX+SI] <=> MOV AX, [MASK+BX+SI]
(DS)= 3000H, (BX)= 2000H, (SI) = 1000H, MASK= 0250H
=> PA=16d*(DS)+(BX)+ (SI)+MASK
PA = 30000+2000+l000+0250 = 33250H
执行结果(AX)= 1234H
比例变址暂无需求,故不介绍,以下为汇总图