快捷搜索:

您的位置:澳门新葡4473网站 > 热门贴子 > 间接操作

间接操作

发布时间:2020-01-24 05:03编辑:热门贴子浏览(163)

    1.        间接操作数

    与数据有关的寻址方式

    下面以数据传送指令MOV为例来说明。其汇编格式为:MOV  目标, 源

    1.立即寻址方式(immediate addressing)

    操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。

    MOV  AL, 6                       ;(AL)=6

    MOV  AX, 3064H             ;(AX)=3064

    2.寄存器寻址方式(register addressing)

    操作数直接包含在寄存器中,由指令指定寄存器号的寻址方式。

    MOV  BX, AX                    ;(BX)=(AX)

    MOV  DI, 5678H              ;(DI)=5678H


     

    除以上两种寻址方式外,以下各种寻址方式的操作数都在存储器中,其操作数称为存储器操作数。

    由于80X86对内存采用分段管理,因此由以下寻址方式得到的只是有效地址(简写为EA-effective address,在IBM PC中就是操作数地址的偏移量部分)。

    有效地址可以由以下四种成分组成:

    位移量(displacement)是存放在指令中的一个8位、16位或32位的数,它是一个地址。

    基址(base)是存放在基址寄存器中的内容。通常用来指向数据段中数组或字符串的首地址。

    变址(index)是存放在变址寄存器中的内容。通常用来访问数组中的某个元素或字符串中的某个字符。

    比例因子(scale factor)是80386以上CPU新增加的。其值可为1、2、4或8。寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。

    EA=基址+(变址x比例因子)+位移量

    3.直接寻址方式(direct addressing)

    操作数的有效地址直接包含在指令中的寻址方式。

    有效地址存放在代码段的指令操作码之后,但操作数本身在存储器中,所以必须先求出操作数的物理地址。这种寻址方式常用于存取简单变量。

    MOV  AL, [78H]

    由于在汇编语言中用符号表示地址,所以指令“MOV  AL,VAR”中的源操作数寻址方式是直接寻址,有时也写做“MOV  AL,[VAR]”

    4.寄存器间接寻址方式(register indirect addressing)

    操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中的寻址方式。对于386以上CPU,允许使用任何32位通用寄存器。

    MOV  AL, [BX]

    5.寄存器相对寻址方式(register relative addressing)

    也称为直接变址寻址方式。操作数的有效地址是一个基址(BX、BP)或变址(SI、DI)寄存器的内容和指令中给定的一个位移量(disp)之和。有效地址由2部分组成。对于386以上允许使用任何32位通用寄存器。

    即:EA=(基址<或变址>寄存器)+disp

    或:EA=(32位通用寄存器)+disp(386型号以上)

    例:  MOV  AL, 8[BX] 或MOV  AL, [BX+8]

    6.基址变址寻址方式(based indexed addressing)

    操作数的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。386以上允许使用变址部分除ESP以外的任何两个32位通用寄存器组合。缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。

    MOV AL,[BX][SI] 或MOV AL,[BX+SI]

    7.相对基址变址寻址方式(relative based indexed addressing)

    操作数的有效地址是一个基址和一个变址寄存器的内容和指令中给定的一个位移量之和。有效地址由三部分组成。80386以上允许使用变址部分除ESP以外的任何两个32位通用寄存器组合。缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。

    MOV AL,MASK[BX][SI] 或MOV AL,MASK[BX+SI]或MOV AL,[MASK+BX+SI]

    8.比例变址寻址方式(scaled indexed addressing)

    注意:80386以上的微处理器才提供。

    EA=(基址寄存器)+(变址寄存器)×比例因子+disp

    其优点在于:对于元素大小为2、4、8字节的数组,可以在变址寄存器中给出元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。

    可以看出,它实际上是386以上CPU存储器操作数寻址方式的通用公式。

    MOV AX, ARY[BX][4*SI]


     

    间接操作数可以是任何用方括号括起来的32位通用寄存器(EAX,EBX,ECX,EDX,

    与转移地址有关的寻址方式

    这里讨论的寻址方式是用来确定转移及调用(CALL)指令的转向地址。下面以8086/8088的无条件转移指令为例来说明,格式为

    JMP   目标

    这里的目标有各种寻址方式。这些寻址方式可以被分为段内转移和段间转移两类。段内转移只影响指令指针IP值;段间转移既要影响IP值,也要影响代码段寄存器CS的值。

    1.段内直接寻址方式(intrasegment direct addressing)

    EA=(IP)+(8位或16位)disp

    位移量disp是一个相对于指令指针的带符号数,EA就是要转向的本代码段内指令地址的偏移量。

    若位移量是8位的,则称为短转移,格式JMP  SHORT  LAB

    若位移量是16位的,则称为近转移,格式JMP  LAB 或JMP NEAR PTR LAB

    2.段内间接寻址方式(intrasegment indirect addressing)

    转向的有效地址在一个寄存器或内存单元中,该寄存器号或内存地址按上节介绍的与操作数有关的寻址方式(立即寻址方式除外)获得。

    JMP  BX 

    JMP  TABLE[BX] 

    JMP WORD PTR [BX]                 ;其中WORD PTR [BX]表示BX指向一个字型内存单元

    3.段间直接寻址方式(intersegment direct addressing)

    指令中直接给出转向的4字节的偏移量和段基址。汇编格式为:JMP FAR PTR LAB。执行时偏移量送IP,段基址送CS。

    4.段间间接寻址方式(intersegment indirect addressing)

    用一个双字内存变量中的低16位取代IP值,高16位取代CS值,从而实现段间转移。例 : JMP DWORD PTR [BX];式中DWORD PTR [BX]表示BX指向一个双字变量。

    ESI,EDI,EBP和ESP),寄存器里面存放数据的偏移。

        PTR与间接操作数的联合使用:操作数的大小通常不明确,如:inc  [esi]编译器在编译时会产生“operand must have size”的错误信息,可以使用PTR操作符明确地表示操作数的尺寸:inc BYTE PTR [esi]

    2.        变址操作数

    变址操作数将常量加到寄存器上以产生一个有效的地址,任何32位通用寄存器都可以

    作为指针寄存器,MASM中允许使用两种不同的格式:

    constant[reg]

    [constant+reg]

    3.        指针

    基于intel体系的基本指针类型:NEAR和FAR。

    保护模式使用NEAR指针被存储在双字节变量中,还可以使用OFFSET操作符。

    定义变量时,TYPEDEF操作符允许创建与内建类型特性完全相同的用户自定义类型。 

    如:PBYTE  TYPEDEF  PTR  BYTE    ;创建了指向字节的数据类型PBYTE

        .data

        arrayB  BYTE  10h,20h,30h,40h

        ptr1  PBYTE   ?

        ptr2  PBYTE   arrayB

    本文由澳门新葡4473网站发布于热门贴子,转载请注明出处:间接操作

    关键词: