汇编语言之寻址方式

Posted 余东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言之寻址方式相关的知识,希望对你有一定的参考价值。

与数据有关的寻址方式

下面以数据传送指令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]


 

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

这里讨论的寻址方式是用来确定转移及调用(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指向一个双字变量。

以上是关于汇编语言之寻址方式的主要内容,如果未能解决你的问题,请参考以下文章

8086汇编语言学习 8086寻址方式

汇编语言中操作数寻址方式都有哪些,各自有啥特点,怎么区分呢?

Android逆向基础之ARM汇编语言知识总结

Android逆向基础之ARM汇编语言知识总结

汇编--寻址方式

汇编语言指令寻址