⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇003.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。 

 

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。

指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

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

解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。其执行过程如图3.7所示。

从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如:
  

图3.7 相对基址加变址寻址方式的执行过程示意图
 

用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。

相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。

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

但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。

相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。表3.1列举出该寻址方式与其它寻址方式之间的变形关系。

表3.1 相对基址加变址寻址方式与其它寻址方式之间的变形关系

源操作数
 指令的变形
 源操作数的寻址方式
 
只有偏移量
 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]
 相对基址加变址寻址方式
 3.8 32位地址的寻址方式
在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。

在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。

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

32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。

下面列举几个32位地址寻址指令:

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] 

用32位地址偏移量进行寻址的有效地址计算公式归纳如右式所示。

由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下: 

1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;
 
 

如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;

2、默认段寄存器的选用取决于基址寄存器;

3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;

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

下面列举几个32位地址寻址指令及其内存操作数的段寄存器。

指令的举例 访问内存单元所用的段寄存器 
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 

3.9 操作数寻址方式的小结
下面控件是学习和理解操作数寻址方式的控件,它把各种寻址方式的变化和限制组合在一起。通过它,读者能更进一步掌握寻址方式的书写格式。
3.10 习题
3.1、访问内存单元的寻址方式有几种?它们具体是哪些?
 
3.2、指出下列各种操作数的寻址方式。
 
1)、[BX]
3)、435H
5)、[23]
7)、[DI+32]
9)、[EAX+90]
 2)、SI
4)、[BP+DI+123]
6)、data    (data是一个内存变量名)
8)、[BX+SI]
10)、[BP+4] 
3.3、哪些寄存器的值可用于表示内存单元的偏移量?
 
3.4、判断下列操作数的寻址方式的正确性,对正确的,指出其寻址方式,对错误的,说明其错误原因。
 
1)、[AX]
3)、BP
5)、DS
7)、[BX+BP+32]
9)、[CX+90]
11)、BX+90H
13)、SI[100h]
15)、[EAX+EBX*6]
 2)、[EAX]
4)、[SI+DI]
6)、BH
8)、[BL+44]
10)、EDX
12)、[DX]
14)、[BX*4]
16)、[DX+90H] 
3.5、已知寄存器EBX、DI和BP的值分别为12345H、0FFF0H和42H,试分别计算出下列各操作数的有效地址。
 
1)、[BX]
3)、[BP+DI]
5)、[1234H]
 2)、[DI+123H]
4)、[BX+DI+200H]
6)、[EBX*2+345H] 
3.6、指出下列各寻址方式所使用的段寄存器。
 
1)、[SI+34h]
3)、ES:[BP+DI]
5)、[BP+1234H]
 2)、[456H]
4)、[BX+DI+200H]
6)、FS:[EBX*2+345H] 


 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -