允许使用段跨越前缀。
例如:MOV AX,ES:[BX+SI] 有效地址: EA =(BX)+(SI)
物理地址 =(ES)×16 +(BX)+(SI)
一般用法:用于表格和数组处理,首地址可放在BX或BP中,用SI或DI来访问数组中的各个元素,也即SI或DI中的值是表内索引。由于二个寄存器值随时都可以修改,使用更加灵活。常用于矩阵数组处理。
7、相对基址变址寻址
操作数的有效地址是一个基址寄存器的内容,一个变址寄存器的内容和指令中指定的位移量之和。
约定关系与基址变址寻址方式相同。 ?若用基址寄存器 BX,段地址在DS中,
EA=(BX)+(SI)+8位或者16位位移量
或者 EA=(BX)+(DI)+8位或者16位位移量
?若用基址寄存器BP:段地址在SS中
EA=(BP)+(SI)+8位或者16位位移量
或者 EA=(BP)+(DI)+8位或者16位位移量
例3.11 MOV AX,MASK [BX] [SI]
13
也可以写成:
MOV AX,MASK [BX+SI] MOV AX,[MASK+BX+SI]
这条指令的三种写法,常用第二种写法。
有效地址:EA = MASK位移量 +(BX)+(SI) 物理地址 =(DS)×16 + EA
其中:MASK是数据段内定义的符号地址。
若MASK是在堆栈段内定义的符号地址, 有指令语句:
MOV AX,MASK [BP+SI]
有效地址:EA = MASK位移量 +(BP)+(SI) 物理地址 =(SS)×16 +EA
此时,BP可指向栈顶,从栈顶到数组首地址用MASK的位移量表示,SI用来访问数组中某个元素。
允许使用段跨越前缀。
寻址方式8、9和10均与比例因子有关,用于80386及其后继机型。(略)
寻址方式综合举例:
把首地址为BLOCK的字数组的第6个字送到
14
DX寄存器的指令序列。
首先在数据段定义BLOCK数组,并且数据段段地址已经送入DS寄存器中。
BLOCK DW 45H,79H,0BCH,1256H,0ACH,
0F6H,3400H;定义七项
存储分配如图所示。 据数段 45H BLOCK+0 第1个字
00
79H +2
第2个字
00 BCH +4
第3个字 00
56H +6 第4个字 12H ACH +8
第5个字 00 F6H +10
第6个字
00 00 +12
第7个字 34H
(1)用直接寻址
MOV DX,BLOCK+10 (2)用寄存器间接寻址
MOV BX,OFFSET BLOCK
15
ADD BX,10
MOV DX,[BX];取数
其中语句OFFSET BLOCK是取变量BLOCK的偏移地址。
(3)用寄存器相对寻址 MOV BX,10 ;将第6个字离表首的位移
量放入BX
MOV DX,BLOCK [BX];取数
(4)用基址加变址寻址
MOV BX,OFFSET BLOCK;取BLOCK首地
址偏移量
MOV SI,10 ;SI为表内索引 MOV DX,[BX+SI] ;取数
3.1.2 与转移地址有关的寻址方式——在控制转移指令中介绍。
3.2 程序占有的空间和执行时间 1.程序装入内存需要占用存储空间
80X86 的机器指令是可变字节指令,不同的指令或者不同寻址方式的机器指令长度不同。一条16位格式指令长度可为1—7字节,32位指令可达14
16