紧接着上一篇我们的标志寄存器,这一篇我大致概括下计算机的寻址方式,因为自己在汇编上也不是知道很多,所以难免有错误之处,还希望高手拍砖。希望这一系列文章能为大家学习汇编提供一个平台。
首先还是说下指令操作数,Intel 8086/8088CPU的指令系统中锁需操作数有以下4种:
(1)寄存器操作数:操作数在CPU的通用寄存器或段寄存器中
(2)立即数操作数:操作数在指令中直接给出
(3)存储器操作数:操作数在存储器的存储单元中
(4)I/O操作数:操作数在输入输出端口的存储单元中
根据操作数来源不同,将指令寻址方式分为寄存器寻址、立即数寻址、存储器寻址和I/O寻址四大类,下面来细说这四类方式。
一、寄存器寻址
在寄存器寻址方式中,操作数来自CPU的某个/某两个通用寄存器中或段寄存器中(CS除外),16位的寄存器操作数可以是AX、BX、CX、DX、SI、DL、SP、BP、DS、SS和ES,8位寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH。由于存取操作数就在CPU内部进行,不需要访问存储器二执行总线周期,所以执行速度非常快,另外通用寄存器数目较少,编码所需的二进制位就少,因而使用寄存器寻址可以有效的减少指令宽度。
例如:MOV
AX, BX;将寄存器BX中的内容传送给寄存器AX中
若执行前AX=1234H, BX=5678H,则指令执行完后AX=5678H,BX中内容不变。
二、立即数寻址
在立即数寻址中指令操作数直接放在代码中。它是紧跟在指令操作码后面的一个可用的8位或16位二进制补码表示的有符号数,即操作数的存放地址是指令操作码的下一个单元,这种操作呗成为立即数。
例如:MOV
AX, 1234H立即数1234H作为源操作数送入寄存器AX中
指令执行后的结果是寄存器AX的值是1234H
三、存储器寻址
在存储器寻址方式下,指令操作数一般是代码段以外的数据段,堆栈段和附加段中的存储单元,指令给出的是存储单元地址或者是存储单元地址的表达式。在汇编语言中一个存储单元地址都是使用逻辑地址来表示的。即段基值:偏移量。其中段基值在某个段寄存器中。偏移量表示了该存储单元与段基值之间的距离,它是由CPU的执行单元EU来确定和计算有效地址EA。执行指令时,CPU首先根据操作数字段提供的地址信息,由执行单元EU计算出有效地址EA,再由总线接口单元BIU根据公式:物理地址=段基值X16+EA计算出操作数的物理地址,有效地址EA由3个地址分量组合而成:
(1)位移量
(2)基址
(3)变址
一般来说,双操作数指令的源操作数和目的操作数不能同时为存储器操作数,存储器寻址方式按EA计算方式的不同可分为:直接寻址、存储器间接寻址、基址寻址/变址寻址、基址变址寻址、相对基址变址寻址和串操作寻址6种。
1.直接寻址
直接寻址时存储器寻址中最简单的一种,即操作数的有效地址EA只由位移量组成,即EA=位移量,位移量是直接包含在指令中的,和指令操作码一起存放在代码段中,而操作数则存放在数据段中,直接寻址方式不涉及其他寄存器。使用直接寻址的实例:
MOV
BX, VAR ;等价于MOV
BX, DS:VAR
MOV
AX, [100H];等价于MOV
AX, DS:[100H]
例如:MOV
AX, [1234H];将当前数据段偏移1234H个字节的子存储单元内容传送给寄存器AX。
设(DS)=2000H, 那么要访问的子存储单元的物理地址为2000H*16+1234H=21234H,
如果该字节的存储单元的内容是5678H,则(AX)=5678H。
2.存储器间接寻址
在存储器间接寻址方式中,指令的操作数在存储器中,操作数的有效地址EA不像直接寻址方式那样直接存放在指令中,而是由基址寄存器BX、BP或变址寄存器SI、DI提供。
如果指令中使用的是BX、SI、DI,则操作数在数据段中,段基值在数据段寄存器DS中,则操作数物理地址为:
物理地址=16*(DS)+(BX)/(SI)/(DI)
如果指令中实用的是BP,则操作数在堆栈段中,段基值在堆栈段寄存器SS中,操作数的物理地址为:
物理地址=16*(SS)+(BP)
本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/938282,如需转载请自行联系原作者