回复:看看
寻址方式
1.寻址方式
(1)寻址方式是指令中用于说明操作数所在地址的方法。如何正确地获得指令所需的操作数是寻址要求完成的工作。
(2)80X86的寻址方式可分为程序地址寻址方式和操作数地址寻址方式。
(3)80X86系列计算机有8种基本的操作数寻址方式:
· 立即寻址
· 直接寻址
· 寄存器寻址
· 寄存器间接寻址
· 寄存器相对寻址
· 基址加变址寻址
· 相对基址加变址寻址
· 比例变址寻址(比例变址寻址只在80386到Pentium微处理器中使用)
2.立即寻址
(1)特征
· 立即寻址又称立即数寻址。
· 操作数紧跟在操作码之后,直接放在指令中,执行速度快。这种操作数称为立即数。
· 立即数规定只能为整数。立即数可以是8位或16位的。若是16位的,要求低字节数放在低位地址中,高字节数放在高位地址中。80386或更高档机器中,立即数可以是双字节的。
· 立即数只能作为源操作数,不能作为目的操作数。
· 它主要用来给寄存器赋值。
(2)举例
MOV AX ,2056H
这条语句中,MOV指令是一个数据传送指令,它的功能是将数据2056H送入AX寄存器,执行后,AL中为56H,AH中为20H,如图2-1所示。
图2-1 立即寻址实例
3.直接寻址
(1)特征
· 直接寻址方式的操作数地址的16位偏移量(又称有效地址EA)直接包含在指令中,它紧跟在操作码之后,存放在代码段区域内。
· 如果指令前面无前缀指明在哪一段,则默认操作数存放在数据段寄存器DS中。它的地址为数据段寄存器DS加上这16位地址偏移量。
· 如果存放操作数的存储区是在DS段以外的段中,则应在指令中指定段跨越前缀。
· 用符号地址代替数值地址。
(2)举例
MOV AX,DS:[2000H]
如果(DS)=3000H,EA=2000H,则物理地址为32000H,操作过程如图2-2所示。
4.寄存器寻址
(1)特征
· 操作数在CPU的内部寄存器中,寄存器名由指令指出。
· 对8位操作数,寄存器可以是AL, AH, BL, BH, CL, CH, DL, DH中的任一个;对16位操作数,寄存器可以是AX, BX, CX, DX, SI, DI, SP或BP之一。
· 这种从寄存器取得操作数的方式,与从存储器取操作数相比,执行速度要快。
图2-2 直接寻址实例
(2)举例
MOV BX,AX ;将AX中的内容送入BX
如指令执行前(AX)=2056H,(BX)=1200H
则指令执行后(BX)=2056H,(AX)保持不变,如图2-3所示。
图2-3 寄存器寻址实例
5.寄存器间接寻址
(1)特征
· 寄存器间接寻址方式的操作数在存储器中。
· 操作数地址的16位偏移量包含在寄存器BX, BP, SI和DI之一中。
· 如果指令中未具体用前缀指明是哪个段寄存器,寻址时,对于BX, SI, DI寄存器,则默认操作数在数据段寄存器DS中,即数据段寄存器DS加上SI, DI, BX中的偏移量为操作数的地址。
· 对于BP寄存器,默认的段寄存器为SS。
(2)举例
MOV AX,[SI]
其操作过程如图2-4所示。
图2-4 寄存器间接寻址实例
6.寄存器相对寻址(或称变址寻址)
(1)特征
· 采用寄存器间接寻址时,允许在指令中指定一个8位或16位的偏移量。
· 有效地址由一个基址或变址寄存器的内容加上一个偏移量来得到,即
有效地址EA=
+(8位偏移量或16位偏移量)
如果使用BP变址,则与堆栈寄存器相加,形成操作数地址。
(2)举例
MOV AX,COUNT[SI]
或
MOV AX,[COUNT+SI]
若(DS)=3000H,(SI)=2000H,COUNT=3000H,则其寻址过程如图2-5所示。
图2-5 变址寻址
7.基址加变址寻址
(1)特征
· 将一个基址寄存器的内容加上一个变址寄存器的内容形成操作数的有效地址。
· 基址寄存器名和变址寄存器名均由指令指出。
· 如无段跨越前缀,对于BX寄存器,默认的段寄存器为DS。只要用上寄存器BP,则默认的段寄存器为SS。
(2)举例
MOV AX,[BX][SI]
或 MOV AX,[BX+SI]
若 (DS)=3000H
(BX)=2000H
(SI)=1000H
则偏移地址EA=2000H+1000H=3000H,物理地址=30000H+3000H=33000H,如图2-6所示。
图2-6 基址加变址寻址示意
重点
80386或更高档机器中,可以用EAX, EBX, ECX, EDX, BX, EBP, ESI和EDI任意组合产生存储地址,例如:
MOV CL ,[EAX+EBX]
MOV [ECX+EAX] ,BX
8.相对基址加变址寻址
(1)特征
· 基址加变址寻址也允许带一个8位或16位的偏移量。
· 操作数的有效地址是一个基址寄存器的内容加上一个变址寄存器的内容,再加一个8位或l6位的偏移量。
(2)举例
MOV AX,MASK [BX] [SI]
或 MOV AX,MASK [BX+DI]
或 MOV AX,[MASK+BX+DI]
设(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,则
物理地址=30000H+2000H+2000H+0250H=33250H
如图2-7所示。
图2-7 相对基址加变址寻址
重点
80386或更高档机器可以用EAX, EBX, ECX, EDX, BX, EBP, ESI和EDI寻址内存,例如:
MOV AX,ARRAY[EAX+ESI]
这种寻址方式用起来比较灵活,尤其为堆栈数组的访问提供了较大的方便。访问堆栈数组时,将BP指向栈顶,偏移量用来表示栈顶到数组首地址的距离,变址寄存器DI(或SI)用来指向数组中某个元素。
9.比例变址寻址
(1)特征
· 比例变址寻址只能在80386到Pentium微处理器中使用。
· 比例变址指一对寄存器中的第二个用比例因子2, 4或8来乘,产生操作数的内存地址。
(2)举例
MOV EDX,[EAX+4*EBX]
该指令将由EAX加上4倍EBX寻址的数据段存储单元的内容装入EDX。比例因子允许存取单字(乘2),或双字(乘4),或4字(乘8)的内存数组数据。
注意:也存在乘1的比例因子,它意味着常规的寻址,一般不出现在指令中。MOV AL,[EBX+ECX]就是比例因子的例子。换句话说,这条指令可以写成MOV AL,[EBX+1* ECX]。另一个例子是指令MOV AL,[2+EBX],它只用一个比例寄存器去寻址内存。
|