80486的寻址方式

在汇编语言中寻找指令中所需的操作数或操作数地址的方式称为寻址方式。80386微处理器指令中所需操作数来自以下几个方面:
   (1)操作数包含在指令中。在取指令的同时,操作数也随着去处。这种操作数称为立即数
   (2)操作数包含在CPU的某个内部寄存器中。
   (3)操作数在内存储器中。

由于内存储器在CPU外,因此在寻找此种操作数时首先需要找到其在内存中的地址。80386系统中,任何内存单元的地址由段基地址和偏移地址(偏移量)组成。段基地址由段寄存器提供,而偏移量则由以下几个部分组合而成:
   基址寄存器,变址寄存器,比例因子,位移量
   这4个部分称为偏移地址4元素,将这4元素组合而成的偏移地址成为有效地址EA,组合方式为:
      EA = 基址 + 变址*比例因子 + 位移量
   这4种元素可以优化组合出9种存储器寻址方式,加上立即数寻址和寄存器寻址,共有11种寻址方式。

 (1) 立即数寻址(Immediate Addressing)
    即指令中所需的操作数放在指令中。
    (2)
 寄存器寻址 (Register Addressing)
    指令中所需操作数在CPU某寄存器中(通用寄存器或段寄存器)。
    (3) 直接寻址 (Direct Addressing)
    操作数一般存放在存储器的数据段中,而操作数的有效地址EA由指令给出,因此要取得操作数必须先求出操作数所在存储单元的物理地址。如果操作数在数据段中,则物理地址为:物理地址 = DS*16 + EA,例如:
    MOV AX, DS:[2000H]    
通常DS可省略,因此可为:MOV AX, [2000H]
    而且可以用符号地址来代替数据地址,如:
    MOV AX,VALUE, 
    VALUE为存放操作数的存储单元的符号地址,上述指令还可写为:
    MOV AX,[VALUE],如果VALUE不在数据段中,而在附加段中,则应指定段跨越前缀,如:
    MOV AX,ES:VALUE
    直接寻址方式适用于处理单个变量,例如要处理某个存放在存储器中的变量,可用直接寻址方式将变量送到一个寄存器中,然后再进一步处理。
    (4)寄存器间接寻址 (Register indirect Addressing)
    操作数在存储器中,其有效地址EA在某个寄存器中。8个32位通用寄存器都可以作为寄存器间接寻址用。除ESP,EBP默认段寄存器为SS外,其余6个通用寄存器均为默认段寄存器DS。例如:
    MOV EBX,[EAX]
    (5)基址寻址 (Based Addressing)
    操作数在存储单元中,其有效地址EA由基址寄存器内容与指令中给出的位移量之和给出。8个32位通用寄存器都可以作为基址寄存器。除ESP,EBP默认段寄存器为SS外,其余6个通用寄存器均为默认段寄存器DS。例如:
    MOV DX,[EAX+1500H]
    (6)变址寻址 (Index Addressing)
    变址寻址中,EA=(变址寄存器)+位移量。它的指令书写格式和寻址执行过程和基址寻址相同,区别仅是将基址寄存器改成变址寄存器。除ESP外,其他7个通用寄存器均可作为变址寄存器,EBP默认SS作段基址寄存器,其余均以DS作段基址寄存器。
    例如:MOV EAX, [EBP+50H],        MOV EDX, DATA[ECX]
    基址寻址和变址寻址适用于对一维数组的元素进行检索操作。常用位移量表示数组的起始地址的偏移量,基址/变址寄存器表示数组元素的下标,可修改来获取数组元素的值。
    (7)比例变址寻址(Indexed Proportion Addressing)
     EA = (变址寄存器)*  比例因子 + 位移量
     比例因子可以取1,2,4或8 ,只适用于32位寻址方式。
     例如:MOV EAX, TABLE[ESI*4]
    (8)基址加变址寻址 (Based Indexed Addressing)
     EA = (基址寄存器) + (变址寄存器)
     例如:MOV CX, [BX+SI]      MOV EAX, [EDX][EBP]
     基址加变址寻址主要用于二维数组的操作
    (9)基址加比例变址寻址
     此种寻址方式中,EA = (变址寄存器)* 比例因子 + (基址寄存器)
     例如:MOV EAX, [ECX*8][EDX]
     只适用于32位寻址方式,应用与基址加变址寻址相同。
    (10)带位移的基址加变址寻址
     此种寻址方式中,EA = (变址寄存器)* 比例因子 + (基址寄存器)
     例如:MOV AX, [BX+SI+MASK]      ADD EDX, [ESI][EBP+0FFF0000H]
    (11)带位移的基址加比例变址寻址
     EA = (变址寄存器)*比例因子 + (基址寄存器)+ 位移量
     此种寻址方式只有32位寻址一种情况,各种约定和默认情况同前所述。
     例如:INC [EDI*8][EDX+40]

     以上11种寻址方式可分为两种:
    (1)非存储器操作寻址方式,包括立即数和寄存器寻址
    (2)存储器操作寻址方式。 在进行访问存储器操作时,除要计算偏移地址EA外,还必须确定操作数所在的段,即确定有关的段寄存器。一般情况下,指令不特别指出段寄存器,因为对于各种操作类型的存储器寻址,80486约定了默认的段寄存器。
    有的指令允许段超越寻址,这是指令中应加上超越前缀。代码只能放在代码段中,只能用IP作偏移地址寄存器。堆栈操作数只能在堆栈段中,只能用SP作偏移地址寄存器。串操作中目的操作数只能在附加数据段ES中。


 

 

你可能感兴趣的:(优化,汇编,table,存储,语言)