三、寻址方式

来源:互联网 发布:lte测试必知 编辑:程序博客网 时间:2024/04/30 05:47

掌握32位地址的寻址方式及其寻址公式的特殊性。

熟练掌握立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址的各寻址方式中,其定位操作数的基本过程。

CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,大量的指令在操作过程中都会涉及操作数。

立即数寻址方式:操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。

汇编语言中,如果是双操作数指令,逗号前面的为目标操作数,逗号后面的为源操作数。例如:MOV  AX,BX;AX为目标操作数,BX为源操作数。立即数不能做为目标操作数,但可以作为源操作数

立即数寻址方式通常用于对通用寄存器或内存单元赋初值。

寄存器寻址方式:指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器的寻址方式称作寄存器寻址方式。

源和目的操作数都可以是寄存器.

8位的寄存器:AHALBHBLCHCLDHDL

16位的寄存器:AXBXCXDXSIDISPBP

32位的寄存器:EAXEBXECXEDXESIEDIESPEBP

在指令执行过程中,会减少读/写存储器单元的次数, 有较快的执行速度.

直接寻址方式:指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址的寻址方式叫做直接寻址方式。

在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”“]”内。在程序中,直接地址通常用内存变量名来表示。

MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址

MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址

寄存器间接寻址:操作数在存储器中,操作数的有效地址用SIDIBXBP(存储器指针)之一来指定的寻址方式为寄存器间接寻址方式。

在不使用段超越前缀的情况下,有下列规定:

1若有效地址用SIDIBX等之一来指定,则其缺省的段寄存器为DS

2若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)

例:MOV BX,[DI],在执行时,(DS)=1000H(DI)=2345H,存储单元12345H的内容是4354H。执行指令后,BX的值是4354H

寄存器相对寻址方式:与寄存器间接寻址方式在操作数的有效地址的计算上存在区别,其他的基本相同。区别:其有效地址是一个存储器指针的内容和指令中的8/16位偏移量之和。

在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。(不甚懂)

例:MOV BX, [SI+100H],在执行它时,(DS)=1000H(SI)=2345H,内存单元12445H的内容为2715H,该指令执行后,BX的值是2715H

基址加变址寻址方式:操作数在存储器中,其有效地址是一个基址寄存器(BXBP)和一个变址寄存器(SIDI)内容之和的寻址方式为基址加变址寻址方式。

规定:

如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS

例:MOV BX, [BX+SI],在执行时,(DS)=1000H(BX)=2100H(SI)=0011H,内存单元12111H的内容为1234H。该指令执行后,BX的值是1234H

相对基址加变址寻址方式:与基址加变址寻址方式在操作数的有效地址的计算上存在区别,其他的基本相同。区别:其有效地址是一个基址寄存器(BXBP)、一个变址寄存器(SIDI)和指令中的8/16位偏移量之和。

从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。

例:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H(BX)=2100H(SI)=0010H,内存单元12310H的内容为1234H。该指令执行后,AX的值是1234H!

源操作数

指令的变形

源操作数的寻址方式

只有偏移量

MOV AX, [100H]

直接寻址方式

只有一个寄存器

MOV AX, [BX] MOV AX, [SI]

寄存器间接寻址方式

有一个寄存器和偏移量

MOV AX, [BX+100H] MOV AX, [SI+100H]

寄存器相对寻址方式

有二个寄存器

MOV AX, [BX+SI]

基址加变址寻址方式

有二个寄存器和偏移量

MOV AX, [BX+SI+100H]

相对基址加变址寻址方式

   32位地址的寻址方式:在用16位寄存器来访问存储器单元时,只能使用基地址寄存器(BXBP)和变址寄存器(SIDI)来作为地址偏移量(有效地址)的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAXEBXECXEDXESIEDIEBPESP)都可以是地址偏移量的一个组成部分。

    当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘124832位变址寄存器,一个8/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。

32位基址寄存器是:EAXEBXECXEDX

ESIEDI

EBPESP

32位变址寄存器是:EAXEBXECXEDX

ESIEDI

EBP       (ESP之外)

    规定:

1地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器。如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器

2默认段寄存器的选用取决于基址寄存器,基址寄存器是EBPESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS

3在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。

举例指令:

MOV AX, [123456H]    MOV EAX, [EBX]    MOV EBX, [ECX*2]    MOV EBX, [EAX+100H]

MOV EDX, [EAX*4+200H]    MOV EBX,[EAX+EDX*2]    MOV EBX, [EAX+EDX*2+300H]

MOV AX, [ESP]

指令的举例

访问内存单元所用的段寄存器

MOV  AX, [123456H]

;默认段寄存器DS

MOV  EAX, [EBX+EBP]

;默认段寄存器DS

MOV  EBX, [EBP+EBX]

;默认段寄存器SS

MOV  EBX, [EAX+100H]

;默认段寄存器DS

MOV  EDX, ES:[EAX*4+200H]

;显式段寄存器ES

MOV  [ESP+EDX*2], AX 

;默认段寄存器SS

MOV  EBX, GS:[EAX+EDX*2+300H]

;显式段寄存器GS

MOV  AX, [ESP] 

;默认段寄存器SS

我的本章小结:直接寻址——[有效地址:16进制内存地址]

               间接寻址——[有效地址:寄存器]

               相对寻址——[有效地址:寄存器加上8/16位偏移量]

原创粉丝点击