那些年,我们一起学过的汇编----之寻址方式(二)

简介:

紧接上一篇文章《那些年,我们一起学过的汇编---之寻址方式(一)》,我们继续来探究关于寻址方式。

3、基址寻址/变址寻址
基址寻址/变址寻址也没成为寄存器相对寻址,其操作数的有效地址EA是一个基址寄存器(BX或BP)或者是变址寄存器(SI或DI)的内容与指令中制定的一个8位或16位的位移量之和,即
有效地址EA=(BX)/(BP)/(SI)/(DI)+8位位移量/16位位移量
使用BX/BP寻址时即成为基址寻址,使用SI/DI时,即成为变址寻址。
如果使用寄存器BX、SI、DI,则隐含使用的段寄存器为DS, 如果使用寄存器BP则隐含的使用堆栈寄存器SS, 若操作数前指定了段寄存器,那么以指定的段寄存器为准。即操作数的物理地址为:
物理地址=16*(DS)+(BX)/(SI)/(DI)+8位位移量/16位位移量
或者 物理地址=16*(SS)+(BP)+8位位移量/16位位移量
 
使用基址寻址/变址寻址的示例如下:
 
 
  1. MOV AL, 10H[BX];等价于MOV  AX, DS:10H[BX] 
  2. MOV AL, 20H[SI];等价于MOV  AL, DS:20H[SI] 
  3. MOV AH, ES:30H[BX] 
例:MOV AX, 10H[BX]
设(DS)=2000H, (BX)=20H, (20030H)=1234H, 则操作数的物理地址=16*2000H+10H
 
+20H=20030H, 执行结果是(AX)=1234H
4、基址变址寻址
基址变址寻址的操作数有效地址EA是一个基址寄存器(BX或BP)的内容,一个变址寄存器(SI或DI)的内容与指令中制定的一个8位或16位的位移量之和,即:
有效地址EA=(BX)/(BP)+(SI)/(DI)+8位位移量/16位位移量
如果基址寄存器为BX,那么隐含使用的数据段寄存器DS,如果基址寄存器为BP。则隐含使用的是堆栈寄存器SS那么以指定的段寄存器为准,因此,操作数的物理地址为:
物理地址=16*(DS)+(BX)+(SI)/(DI)+8位位移量/16位位移量
或者 物理地址=16*(SS)+(BP)+(SI)/(DI)+8位位移量/16位位移量
使用基址变址寻址的方式示例如下:
MOV AX, 10H[BX][SI];等价于MOV AX, DS:10H[BX][SI]
MOV 20H[BP][DI], CX;等价于MOV SS:20H[BP][DI], CX
前面说的几种存储器寻址方式中,比如直接寻址、寄存器间接寻址、基址寻址/变址寻址实际上都是基址变址寻址的特例,位移量可以用常数表示,也可以用变量表示,位移量可放在方括号前面,也可放在方括号中同寄存器一起写成一个地址表达式,例如下面几种写法便是等价的:
 
 
  1. MOV VAR[BX][SI], AX 
  2. MOV [BX+VAR][SI], AX 
  3. MOV [BX][SI+VAR], AX 
  4. MOV [BX+SI+VAR], AX 
例:MOV AX, 10H[BX][SI]
设(DS)=2000H, (BX)=1000H, (SI)=3000H, (24010H)=1234H.则
操作数的物理地址=16*2000H+1000H+3000H+10H=24010H, 执行结果(AX)=1234H
5、串操作寻址
Intel 8086/8088CPU提供了一些专门用于串操作的指令,串操作指令操作数虽然在存储器中,但是它们不使用前面我们所说的各种寻址方式,而是隐含使用了两个变址寄存器SI和DI,串操作指令在寻找源操作数时,隐含使用SI作为地址指针,源操作数地址由DS:[SI]提供,寻找目的操作数时,隐含使用DI作为地址指针,目的操作数地址由ES:[DI]提供,在每次操作完后,指令将自动修改SI和DI的值,使它们指向下一个单元,指针修改的方向由CF决定,这也就是我在另一篇文章中所说的标志寄存器(http://yiluohuanghun.blog.51cto.com/3407300/938213)。
四、I/O寻址
I/O指令是CPU与外部设备进行通讯的最基本的途径,这意味着即使使用DOS功能调用或BIOS运行程序,其例行程序本身也是用I/O指令与外部设备进行数据交换的。
1、输入指令
一般格式为IN AL, PORT
2、输出指令
一般个事为OUT PORT, AL
至此为止,我们已经把计算机的几种寻址方式一一列举,希望对大家有帮助!
 
 

 

     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/938648,如需转载请自行联系原作者


相关文章
|
11月前
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
82 0