汇编语言之寻址方式
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],我们可以用更加灵活的方式来定位一个内存单元的地址。以上这几种定位内存地
址的方法就称作寻址方式。
作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)