汇编语言之寻址方式



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

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命名空间的使用

namespace hunan\changsha class Person{ static $namewu_han; } namespace hunan\changsha 声明命名空间,它的作用包括方法,类名,常量,这三者都统称为元素 当在程序里使用元素的时候,默认在当前的命名空间里找该元素…

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metrics

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metricsIntrodotnet-monitor 是微软推出的一个帮助我们诊断和监控 .NET 应用程序的工具,在 Kubernetes 中我们可以让 dotnet-monitor 作为 sidecar 运行,无侵入地监控 .NET 应用,今天我们就来…

DOM 事件深入浅出(二)

在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法。本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性和方法。 那么什么是DOM事…

arcgis 分区 属性值_ArcGIS制图之Maplex自动点抽稀

制图工作中,大量密集点显示是最常遇到的问题。其特点是分布可能不均匀、数据点比较密集,容易造成空间上的重叠,影响制图美观。那么,如果美观而详细的显示制图呢?主要原理Maplex中对标注有很好的显示控制,一…

学术造假导致导师自杀,后将这段学术丑闻经历出书贩卖,一年收入上百万......

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年2月11日,小保方晴子又被撤回了一篇研究论文。Tissue Engineering Part A撤稿给出的原因是:通过哈佛医学院正式调查后,无法确实其实验结果的准确性,尽管作者本人坚持已…

汇编语言之数据处理的2个基本问题

1、bx、si、di和bp Bx、si和di这3个寄存器我们已经学过了,现在进行一下总结,并学一下bp。 1:在8086CPU中,只有这4个寄存器可以用在[…]中来进行内存单元的寻址。比如,下面的指令都是正确 的…

js(jQuery)获取时间的方法及常用时间类

获取JavaScript 的时间使用内置的Date函数完成 var mydate new Date();mydate.getYear(); //获取当前年份(2位)mydate.getFullYear(); //获取完整的年份(4位,1970-????)mydate.getMonth(); //获取当前月份(0-11,0代表1月)mydate.getDate(); //获取当前日(1-31)mydate.getD…

phalcon: 缓存片段,文件缓存,memcache缓存

几种缓存,需要用到前端配置,加后端实例配合着用 片段缓存: public function indexAction(){//渲染页面$this->view->setTemplateAfter(common);//缓存片段 //前端配置$frontcache new \Phalcon\Cache\Frontend\Output(array(&q…

nvm用标准sata ahci码_能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘...

不知不觉当中,固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘,使用NVMeSATA的固态硬盘高低搭配。既然是高低搭配,就一定会有性能差距,是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速&#xff0…

天了噜!定义static字段还有顺序要求?

前言前段时间,发现一个bug,代码结构类似下面的示例。你能说出这段代码的正确返回结果吗?class Program {private static int a1 a2;private static int a2 Init();private static int Init(){return 123;}static void Main(string[] args){…

汇编语言之转移指令和原理

1、引言 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类: 1. 同时修改CS和IP时,称为段间转移&#…

【高德地图开发2】---配置工程

1.从网站下载开发包并解压。 3D地图包解压后得到:3D地图显示包“Android_Map_2.x.x.jar ”和文件夹“ armeabi ”(以 V2.2.0为例,含 - libamapv302.so 和 libmapv302ex.so 文件)。2D地图包解压后得到:2D地图显示包“An…

antd option宽度自适应_建议收藏:Axure手机自适应教程

hello,我又来啦,今天和大家分享用axure怎么做自适应,也就是说,我们做app端的作品时,怎么在不同的手机尺寸,显示最佳的样式。那么这期的话,我会以一个游戏的案例来展开,所以比较好玩。…

svn之Previous operation has not finished; run ‘cleanup‘ if it was interrupted解决办法

今天提交代码的时候出现了 Previous operation has not finished; run cleanup if it was interrupted 解决办法: 点击项目右键,然后点击乌龟svn,然后再去点击 clean up 就可以解决了 

安装pip

2019独角兽企业重金招聘Python工程师标准>>> linux系统安装pip: 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pip.py 2.安装pip python get-pip.py windows系统安装pip,这里使用easy_install: 1.首先在命令行切换到easy_install.exe所在的Scri…

所以,路遥工具箱到底是什么东西?

笔者的软件开发生涯是从 2008 年开始的,彼时还是 2G 时代。站长之家是笔者当时经常访问的网站,站长工具也成为当时探索网络世界时的入门工具。软件开发这些年也是浑浑噩噩的度过,鲜有建树。2020 年之前也写了一些小工具用于解决一些注入字符串…

刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

▲ 点击查看前阵子发现一个英国BBC制作的纪录片,叫《逻辑的乐趣》(The Joy Of Logic),介绍了逻辑的概念,逻辑的发展史,及其在现实生活中的应用和价值。讲解非常有意思,深入浅出,风趣…

oracle技术之顺序文件上的索引(一)

顺序文件上的索引(一)研究索引结构,我们首先来考虑最简单的一种:由一个称为数据文件的排序文件得到另一个称为索引文件的文件,而这个索引文件由键-指针对组成。在索引文件中查找键K通过指针指向数据文件中查找键为K的记…