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

简介:

  紧接着上一篇我们的标志寄存器,这一篇我大致概括下计算机的寻址方式,因为自己在汇编上也不是知道很多,所以难免有错误之处,还希望高手拍砖。希望这一系列文章能为大家学习汇编提供一个平台。

首先还是说下指令操作数,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,如需转载请自行联系原作者

相关文章
|
6月前
|
程序员 索引
逆向学习汇编篇:内存管理与寻址方式
逆向学习汇编篇:内存管理与寻址方式
56 0
|
存储 编译器 C语言
5.6 汇编语言:汇编高效数组寻址
数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现多维数组的寻址方式相对于C语言来说稍显复杂,但仍然可行。下面介绍一些常用的汇编语言方式来实现多维数组的寻址。
146 0
|
7月前
|
索引 存储 C语言
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
267 0
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
|
7月前
汇编指令学习(寻址方式)
汇编指令学习(寻址方式)
61 0
|
算法 vr&ar 网络架构
汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】
汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】
97 0
汇编语言与微机原理/计算机组成原理第三章:寻址方式与数据传送
汇编语言与微机原理/计算机组成原理第三章:寻址方式与数据传送
136 0
|
Ruby
汇编实验2 寻址方式练习
实验目的: 1.理解存储器分段及寻址方式的意义 2.熟练掌握立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址等几种寻址方式。 3.复习巩固DEBUG中的R、D、E命令。 4.掌握用A命令编制程序,U命令进行反汇编,用G、T命令执行程序。
269 0
汇编实验2 寻址方式练习
汇编语言之寻址方式
汇编语言之寻址方式
159 0