汇编语言之寻址方式

举报
chenyu 发表于 2021/07/27 00:34:39 2021/07/27
【摘要】 1、内存单元和[bx]的描述 要完整地描述一个内存单元,需要两种信息:1.内存单元的地址;2.内存单元的长度(即是字节单元还是字单元)。 如:mov ax, [2a78] 表示将一个内存单元中的数据送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为2a78H,段地址 在DS中。 如:mov al, [10f3] 表示将一个内存单元中的数据...

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],我们可以用更加灵活的方式来定位一个内存单元的地址。以上这几种定位内存地

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

 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/52976076

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。