汇编语言之寻址方式

简介: 汇编语言之寻址方式

1、内存单元和[bx]的描述

要完整地描述一个内存单元,需要两种信息:1.内存单元的地址;2.内存单元的长度(即是字节单元还是字单元)。


如:mov ax, [2a78]


表示将一个内存单元中的数据送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为2a78H,段地址


在DS中。


如:mov al, [10f3]


表示将一个内存单元中的数据送入al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址为10f3H,段


地址在DS中。


一个内存单元,段地址默认在DS中,偏移地址可以直接给出,单元的长度可以由具体指令中的其它操作对象(比如说寄存


器)指出。


上面两条指令中,内存单元[2a78]和[10f3],它们的偏移地址分别是2a78H和10f3H,第一条指令中,ax为16位寄存器,


这意味着[2a78]是字单元;第二条指令,al为8位寄存器,这意味着[10f3]是字节单元(8位相当于单字节,16位相当于双字


节)。


再看下面两条指令:


Mov ax, [bx]    mov al, [bx]


[bx]同样也表示一个内存单元,它的偏移地址就是bx的数值。


2、[bx+idata]

请看下面的指令:


Mov ax, [127a]    mov ax, [30e0]    mov ax, [c950]


指令中的127a、30e0、c950都是常量,我们可以用idata来表示:mov ax, [idata]。


再看下面的指令:


Mov bx, 123aH   mov bx, 8762H    mov bx, 4c0eH


指令中的123aH、8762H、4c0eH都是常量,我们可以用idata来表示:mov bx, idata。


Idata是常量的代表。



在上一节中,我们用[idata]和[bx]的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[bx+idata],


它的偏移地址为bx中的数值加上idata。


我们看一下指令mov ax, [bx+200]的含义。将内存单元[bx+200]中的数据送入ax,长度为2个字节(字单元),偏移地址


为bx中的数值加上200,段地址在DS中。


该指令也可以写成如下常用格式:


Mov ax, [200+bx]    mov ax, 200[bx]    mov ax, [bx].200



3、SI和DI

SI是源变址寄存器,DI是目的变址寄存器,它们的功能与BX相近,但它们不能分成两个8位寄存器。


指令:mov bx, 13b2H


     Mov ax, [bx]    ;把内存单元[13b2]中的数据送入ax。


同样地,可以:mov si, 13b2H


             Mov ax, [si]    ;把内存单元[13b2]中的数据送入ax。


也可以:mov di, 13b2H


       Mov ax, [di]    ;把内存单元[13b2]中的数据送入ax。


指令:mov bx, 2a7cH


     Mov ax, [bx+123]    ;把内存单元[2a7c+123]中的数据送入ax。


同样地,可以:mov si, 2a7cH


             Mov ax, [si+123]    ;把内存单元[2a7c+123]中的数据送入ax。


也可以:mov di, 2a7cH


       Mov ax, [di+123]    ;把内存单元[2a7c+123]中的数据送入ax。


4.1节我们用[bx]的方式来指明一个内存单元,同样地我们可以用[si]或[di]的方式来指明一个内存单元,它们的含义基本相同。


4.2节我们用[bx+idata]的方式来指明一个内存单元,同样地我们可以用[si+idata]或[di+idata]的方式来指明一个内存单元,它


们的含义基本相同。



4、[bx+si]和[bx+di]

本节我们学习比前面几节讲解的更为灵活的指明一个内存单元的方式:[bx+si]和[bx+di]。


[bx+si]和[bx+di]的含义相似,我们以[bx+si]为例进行讲解。


[bx+si]表示一个内存单元,它的偏移地址为bx的数值加上si的数值。


指令mov ax, [bx+si]的含义如下:


将一个内存单元[bx+si]中的数据送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx的数值加上


Si的数值,段地址在DS中。


   该指令也可以写成如下常用格式:mov ax, [bx][si]



5、[bx+si+idata]和[bx+di+idata]


本节讲解一种最为灵活的指明一个内存单元的方式:[bx+si+idata]和[bx+di+idata]。


[bx+si+idata]和[bx+di+idata]的含义相似,我们以[bx+si+idata]为例进行讲解。


[bx+si+idata]表示一个内存单元,它的偏移地址为bx的数值加上si的数值再加上idata的和。


指令mov ax, [bx+si+200]的含义如下:


将一个内存单元[bx+si+200]中的数据送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为bx的


数值加上si的数值再加上200的和,段地址在DS中。


该指令也可以写成如下常用格式:


Mov ax, [bx+200+si]


Mov ax, [200+bx+si]


Mov ax, 200[bx][si]


Mov ax, [bx].200[si]


Mov ax, [bx][si].200




6、寻址方式的含义

前面我们学习了几种定位内存地址的方法,现在总结一下:


1.[idata]用一个常量来表示地址,可用于直接定位一个内存单元。


2.[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。


3.[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。


4.[bx+si]用两个变量表示地址。


5.[bx+si+idata]用两个变量和一个常量表示地址。


可以看到,从[idata]一直到[bx+si+idata],我们可以用更加灵活的方式来定位一个内存单元的地址。以上这几种定位内存地


址的方法就称作寻址方式。


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