当前课程知识点:微机原理与接口技术 >  第4周 数据传送指令 >  第14讲 寻址方式 >  寻址方式

返回《微机原理与接口技术》慕课在线视频课程列表

寻址方式在线视频

寻址方式

下一节:通用数据传送指令_01

返回《微机原理与接口技术》慕课在线视频列表

寻址方式课程教案、知识点、字幕

大家好 这一讲我们来学习指令的寻址方式

在上一讲中我已说道这一部分内容是非常非常重要的

它是未来大家能够理解指令学懂指令的基础

所谓寻址方式

就是寻找指令中操作数所在地址的方法

操作数在哪里?

这就是我们这一讲要解决的问题

从上一讲我们所介绍的操作数的三种类型

来看呢 指令中的操作数

它的来源或者运算结果的去向也就只有三种

一种就是由指令直接给出 这就是所谓的立即数

还有就是可能存放在或者说存放到

或者来自于寄存器或者是内存储器

所以下面我们来学习寻址方式的时候

我们整个的寻址方式也分

也可以分成这样三种类型

一种是指令直接给出的方式

还有一种是来自于寄存器的方式

还有一种是存放于存储器中的寻址方式

而最后这一种

是我们应该说是最复杂的一类寻址方式

也是大家

特别容易学糊涂的一种寻址方式

好 下边我们先来看

由指令直接给出的这种寻址方式

这个时候表示运算的对象由指令直接给出

由指令直接给出的寻址方式就一种 叫立即寻址

这个时候也就是说指令中的操作数是立即数

我们已经知道立即数 因为它只是

数据的意思而没有地址的含义

所以它绝对不可能作为目标操作数

那么也就是我们刚才讲的

我们说 虽然每一种寻址方式都

可以适合于源操作数也可以适合于目标操作数

但是就这一种寻址方式

它不适合于目标操作数

它仅仅用于源操作数

接下来我们看一条指令的例子

这条指令在我们上一讲中已经看到过

类似的一条指令

那么这条指令

在前边我们学的时候我们说的是它是从

操作数的角度来给大家介绍的

那么在这里我们从寻址方式的角度来介绍

这条指令的含义应该很明确了

就是将这个常数1200H

送给寄存器AX

立即寻址它和其它的寻址方式不同

在立即寻址中因为这个

操作数

或者说这个立即数

它是由指令直接给出的 所以它在

编译的时候它会和指令码一起

被放在

内存的代码段区里

当这条指令执行的时候

这个操作数呢

就会被拿出来送给它的目标地址

在这里这个目标地址是AX

这就是立即寻址这个指令的执行原理

立即寻址很简单

请大家注意两点

第一点 立即寻址仅适合于源操作数

因为它特指的是立即数

第二呢

这个立即数 当然它

可以是十六位的也可以是八位的

可以是有符号数 也可以是无符号数

但是这种立即寻址方式在程序中间

在实际的程序中间应用的范围非常少

因为

如果我们

比如我们现在像

课件上看到的这条指令 是将这个常数送给AX

那么如果我们下边要给BX赋值

再把一个数送给BX

如果我们要去做一个A和B的相加

那么我们每一条每一条大家可以想象

其实这个程序是没办法编的

所以立即寻址的方式

通常我们只在程序中用于

给某个寄存器或者某个内存单元

赋初值的这种情况下

才会用到

这里留一个问题给大家

在这一条指令中我们可以看到我们是

将1200H这样一个常数送给AX

累加器

在这里AX

是十六位的 这个是非常明确的一个

寄存器的字长

那么1200H呢 它是一个常数

因为AX是十六位字长

所以这个1200H就是1200H

那么如果我们这个时候目标操作数

不是寄存器

而是一个内存单元的话

一个存储器操作数的话

那么这个存储器操作数到底代表一个字节单元

还是两个字节单元 或者其它字节单元呢?

就不知道

那么你说1200H不是

十六位吗?那么内存肯定是两个单元

不是的 因为立即数的前边是可以加零的

1200H我们可以说001200H

也可以说00001200H

等等一系列

所以立即数的字长也是不确定

那么这就意味着

如果说目标操作数

字长不确定 源操作数的字长也不确定

那么这个时候该怎么办呢

把这个问题我们先留在这里

请大家自己先思考

我们在后边学指令的时候

我们会回答大家这样一个问题

这是有关立即寻址

也就是说由指令直接给操作数的一种寻址方式

那么第二种

就是指令的操作对象或者

运算的数据放在寄存器中的这样一种

寻址方式

我们称为寄存器寻址

这个时候表示参加运算的数据

在某个寄存器里

或者更多的时候在某个通用寄存器中

我们也来看这样一个例子

比如 这条指令 我们前边也见到过

这条指令

就是讲BX寄存器的内容送给AX

寄存器寻址也很简单像立即寻址一样

很容易理解

就是请大家注意

寄存器寻址中这里的寄存器

绝大多数情况下指的是通用寄存器

不会指控制寄存器

在偶尔的时候会指段寄存器

我们要花更多的精力来学习下边的

这一大类寻址方式

也就是有关存储器的寻址方式

存储器寻址 表示运算的数据在内存中

在学习的时候请大家一定要关注这样几点

首先

存储器寻址表示运算的数据在内存中

它们在指令中的表现形式是方括号

这一点我们前边已经提到了

在指令中 会直接给出运算的数据

在内存中某个逻辑段的偏移地址

不会给出段地址

更不可能给出物理地址

原因就是 这个程序或者说这个数据

或者更微观地讲这条指令

在它装入内存之前 也就是你编写的时候

你根本不知道它会装入到内存的什么地方

它实际上是临时找地方

由操作系统见缝插针根据情况装进去

所以我们在编程序的时候没有办法

知道它的段地址

它具体的段地址

更不可能知道它的物理地址

我们但是可以给出它的偏移地址

因为知道了偏移地址

以后它在一段逻辑段确定的情况下

它会做一个相应的变换把这个偏移地址

变换成一个真实的偏移地址

所以在下边的存储器寻址中

指令中的存储器是用方括号来描述的

方括号中会告诉你

这个指令的操作数

在内存

某个逻辑段中它的偏移地址是多少

有关存储器寻址 最麻烦的就是方括号中

偏移地址的表现形式

不同的表现形式这就引出了我们下边

多种不同的存储器寻址方式

那么知道了偏移地址 这个数据到底在

在哪个逻辑段呢?

数据在内存中逻辑段的段地址

可以通过

隐含的或者说默认的

或者通过重设的方法来给出

但是请大家注意只能够

实际上只能隐式地给出

而不能直接告诉它 段地址是123

还是456 这是绝对不行的

这也是我们今天计算机因为是

有操作系统在管理

你已经没有办法直接去控制到这样

底层的层面上

请大家一定注意

存储器操作数的字长本身并不确定

它的字长完全取决于

指令中另外一个操作数的字长

这就是刚才我给大家提出的问题

当另外一个操作数的字长是确定的情况下

这个存储器操作数的字长就确定

比如我们另外一个操作数是AX

那么这个存储器

比如我们目标操作数是

AX

那么是十六位的它是确定的

那么这个时候源操作数

它如果是存储器操作数的话

它也就跟着确定是十六位了

但是如果我们像刚才

提的那个问题 如果源操作数是

立即数 目标是存储器

操作数 两个字长都不确定

那么这个时候就麻烦了

这个时候我们必须要想办法确定一个操作数

的字长

这个后面我们学指令的时候会介绍给大家

但是下边我们要注意存储器操作数的字长

是不确定的

它的字长完全由另外一个操作数

指定 或者说 另外一个操作数

作为它的参照系来存在

第一种有关存储器操作数的寻址方式

我们叫直接寻址

所谓直接寻址就是在指令中

直接给出了这个数据

它在内存中的偏移地址

刚才我们已经知道存储器操作数在

指令中的表现形式就是方括号

而方括号里边就是运算数据的偏移地址

那么这里的直接寻址

就意味着在方括号里直接给出了数值

运算数据的偏移地址

它的格式就是这样

它在方括号里是一个常数

这个常数就是偏移地址

所以这条指令的执行

我们看目标操作数是AX表示

十六位寄存器

那么这个时候连着方括号一起的源操作数

它就是一个十六位的操作数

这个数在哪儿呢?在内存中

它的偏移地址

是1200的这个地方

因为目标是十六位 所以这个时候

它表示传送了两个

字节单元的内容

其中1200里边是低八位

1201里是高八位 这个我们在上一讲

讲操作数的时候我们已经看到过类似的例子

那么这个数偏移地址是1200

它的段地址是多少呢?

我们下边来说一下

在直接寻址方式下

如果你没有经过特殊的处理的话

数据会默认在数据段中

也就是说 它是默认这个时候是数据段的

当然你说我这个数据不想

在数据段我可以要改到其他的段

是可以的

这个改的方法我们叫 段重设

比如在这里 偏移地址依然是1200

但是呢 因为前边有了这样一个东西

我们就不是在数据段了

这个时候表示在附加段了

就是说 本来我们都是1200但是这个时候

刚才在二楼现在在三楼了

不同的楼层

这个段寄存器冒号

叫做段重设符

因为我们说一共不管逻辑段有多少个

但是一共只有四种类型

所以 每一种类型用段寄存器

是唯一可以对应的

段寄存器里就放的是这种类型

的逻辑段的段地址

所以用段寄存器来表示这个逻辑段

它加上冒号就是段重设

这是直接寻址 也就是说总而言之

简单的一句话 就是在指令中直接给出了

存储器操作数的偏移地址

也就是说直接给出了数据在内存中

它的偏移地址

对应着直接寻址我们就有了第二

种有关存储器的寻址方式

叫做间接寻址

那么在这种情况下和

直接去对应 也就是说

它没有直接给出这个数据在内存中的偏移地址

而是间接地给出来了

那么这个间接的方法

也就是说 它将数据在内存中的偏移地址

存放在了某个通用寄存器里

问题是请大家注意我们通用寄存器一共有八个

但是在这里能够用来存放

数据的偏移地址

的寄存器只有四个

这四个寄存器

我们把它叫做另外一个名字 叫间址寄存器

也就是在间接寻址方式下

用来表示数据在内存中的偏移地址的寄存器

或者说用来存放

数据在内存中的偏移地址的寄存器

叫间址寄存器

这是个间址寄存器分别是

BX BP SI和DI

所以大家现在能够回忆起来

我们前边讲BX的时候我们讲过

BX叫做基址寄存器

也就是说它有经常的

它里边的内容

不是运算的数据而是地址

谁的地址 是数据在内存中的

存放地址 当然它是偏移地址

间接寻址的一般格式是这样的

它的方括号里边是一个间址寄存器

间址寄存器的值就是数据的偏移地址

我们同样用一个例子来看一下

这两条指令 第一条指令我们看

是将一个常数1200H送给寄存器BX

第一条指令的执行结果BX就等于1200H

第二条指令呢

目标是AX 没问题是一个十六位的寄存器

那么源操作数是一个

存储器操作数

我们说了 看见方括号表示要找的那个数

要找的这个源操作数

在内存里 内存的什么地方

接着去看方括号里面

方括号里是BX

这就意味着BX的值

就是我们要找的数据的存放处

用这个图来描述

这个时候 因为第一条指令

已经执行完 BX等于1200H了

所以第二条指令执行之前呢

BX的值就是1200了

因为这个时候BX的值已经被放在方括号里了

所以这个1200不再是一般的常数了

而是一个地址的含义了

所以第二条指令执行完以后

就是将内存两个单元的内容送给AX

这个例子我想大家

应该能够看出来

就是说如果仅仅只有第一条指令

这个1200H就是一个一般意义上的常数

什么含义都没有

但是有了第二行指令

那么这个1200H就是一个地址的含义了

那么为什么要引入间接寻址呢?用刚才的

直接寻址不是更简单吗?

我们举一个例子来看比如我们做一个不说长了

就一百个数的求和

我们第一个数

到第一百个数

当然都要放在内存里因为它太大了没有地方放

好 那么在内存里

放在内存的什么地方呢?假设我们从一百号单元开始

一百号单元里放的是第一个数

一百零一放第二个数 以此类推

那么如果我们要做这样一个求和 假设

用直接寻址方式

我们首先要有

从第一百行

我们首先要从第一百号单元里取出第一个数

好比到AL

接着呢我们要从

一百零一号单元里再取出一个数

然后再去相加

然后我们再从一百零二号单元里取数再相加

接着从一百零三号单元里再取数再相加

以此类推

这是一百个数 我们就要写一百行以上的指令

这没法做了

你想要如果要是一万个数一百

万个数求和 手都写断了

所以直接寻址方式在程序中间是

很难用的基本上是不会使用的

但是为什么有间接寻址似乎就

好一些呢 这样一说

因为间接寻址呢

是用某一个间址寄存器

来表示数据的存放地址

我们还用那刚才一百个数求和的例子

我们可以第一次把这个

第一个数在一百号单元

我们把一百单元送给BX

那么我们用间接寻址的方式

就像现在课件上这条指令一样

我们先把一百送给BX

然后第二条指令 把一百

用间接寻址把一百号单元的内容送给AL

接着呢

我们可以有一条指令将BX加一

这就像我们在

C语言或者C++语言里大家有可能

接触到的指针一样的

它一旦加一之后呢

接着等于就BX变一百零一了

那么下次呢我们只需要

取出来还用这条指令就把一百零一号单元内容

由此我们就有可能构成一个循环

这样我们不管是一百个

数运算还是一千个数还是一万个数求和

我们实际上几行指令就可以完成了

所以这就是为什么要引入间接

寻址的这样一个理由

所以间接寻址方式在实际的程序设计中用的是

非常非常广的

下边我们把间接寻址再做一个简单的一个

总结

首先间接寻址方式里边

是由寄存器间接地给出了运算数据

在内存中的偏移地址

其次能够用来表示偏移地址的寄存器只有四个

这四个叫做间址寄存器

BX BP SI DI

请大家一定要记住就只有这四个

或者用大白话讲

方括号里能出现的寄存器

就这四个寄存器

像其他的AX CX DX绝对不能出现在方括号里

间接寻址方式下

刚才我们说了这么多的偏移地址

那么到底数据在哪个逻辑段呢

这个逻辑段的性质由间址寄存器来决定

如果

方括号里边的间址寄存器

选择的是BX或者SI或者DI

那么默认的数据在数据段

如果间址寄存器选择BP默认的就在堆栈段

所以这也是我们前边说BP和SP都会指向堆栈区

但是SP会固定地指向栈顶的位置

而BP可以指向堆栈区的任何一个位置

当然这是说的是默认

我们同样可以通过前边说的段重设的方法

来重设它们

在其它的段

当然除了代码段之外

因为数据不可能在代码段

其它的三种逻辑段你都可以去重设

第三种有关存储器的寻址方式我们叫做寄存器

的相对寻址

这个方式下是表示

在这种寻址方式下

也就是说运算的数据它在内存中

存放在哪个地方

也就是说它在内存中的偏移地址

是由一个间址寄存器加上一个常量

或者说我们叫做位移量的这样一个常数

来合起来描述

它的表现形式通用的表现形式是这样的

方括号里除了刚才

间址寄存器外还会有一个东西

这个东西我们叫位移量

可以是八位的可以是十六位的

那么这个数这个时候它到底在哪个逻辑段

它的段地址完全由间址寄存器来决定

我们举一个例子

这次我们多看几行指令这有四行指令

我们一行一行来读

第一行指令我们将源操作数是立即寻址

目标是寄存器寻址

它的执行结果就是把2000H送给了AX

第二行指令

目标和源都是寄存器

那么这个时候目标是段寄存器 这条指令是对的

这表示把AX的值送给了DX

所以这两行指令执行完

AX和DS是一样的

都是2000H

第三行指令

源操作数也是立即寻址

目标是寄存器寻址

它的执行结果

就是AX等于1200H

第四行指令

就是我们现在要看到的寄存器相对寻址

在这里我们这个5写到了方括号的外面

它实际上完全是一样的

它可以把5写道方括号里边

也可以把5写道方括号的

后边也可以把5写在方括号的前边

这几种格式都是一样的

这四行指令的执行完了以后会是个什么样的结果

前边三行我们都已经描述完了

那么最后一行指令它的执行结果用这张图来描述

这个时候我们看目标是AL

那是累加器没有问题八位寄存器

源操作数是一个存储器操作数

方括号里是这个数的偏移地址

这个地址等于多少呢?

现在我们说BX等于1200

那么再加5那就是1205

所以这个时候我们要找的源操作数

在偏移地址为1205的地方

因为间址寄存器选了BX所以它在数据段

我们没有重设所以默认就在数据段

所以这条指令的执行结果

就是将1205这个单元的内容

拿出来送给累加器AX

这就是寄存器相对寻址

那么为什么要引入相对寻址

你说刚才我为什么要BX加5我直接给BX

赋值1205不完了吗

主要的原因就是相对寻址的引入主要是为了用于

一维数组或者说一维表格的操作

我们知道在一维表格里或说数组里面

它会需要两个参数 一个我们需要知道表头

还有一个呢我们要知道

我们要找的那个数相对于表头之间的距离

所以这个时候两个参数

那么用相对寻址方式我们通常可以将

位移量或者说常数用来作为表头地址

而用寄存器来描述表中的某一个

单元相对于表头的距离

当然你倒过来也是可以的

也是可以的

所以这就是我们这种寻址方式引入的原因

但就是像我们刚才前边讲这种直接寻址方式

它的不方便

一样的道理

在这里相对寻址因为有了位移量 也就是位移量

是个常数

那么一旦在指令中间出现过多的常数

也会带来很多的不便

所以这种方式呢

其实它在使用的时候也会存在

一定的不方便的

那么为了解决这个问题

我们就有了下边的第四种针对存储器

的寻址方式

叫做基址 变址寻址

实际上它也很简单

就是表示操作数

在内存中的偏移地址呢

不再是用一个间址寄存器

而是用两个间址寄存器

这两个间址寄存器的性质不一样

一个必须是

基址寄存器 一个是变址寄存器

那么什么是基址寄存器呢?

我们回顾一下

第二章所学到的这些寄存器

将寄存器那一讲的时候我们讲到的内容

基址寄存器呢一共就两个

一个叫BX一个叫BP

而变址寄存器呢我们一个是SI一个叫

DI

我们又把SI叫做源变址寄存器

而把DI叫做目标变址寄存器

这个都不重要随着后面内容

学习大家再慢慢去理解

在这里我们就记住那两个寄存器是变址

而BX BP叫做基址寄存器

那么也就是说在基址变址寻址方式下

要找的这个数据在内存

的偏移地址

是由这两个寄存器合在一起来构成的

所以 它们在哪个逻辑段

完全由基址寄存器来决定

这也是叫做基址

寄存器这样的一个理由 就是由它们来决定了

这个数据它的段基

当你的基址寄存器选择BX的时候呢

这个数据默认在数据段 选择BP就默认

在堆栈段

在这种寻址方式下

SI和DI不再

具有决定数据在哪个逻辑段这样子

的能力了 而完全是由BX和BP来决定的

所以这种寻址方式我们也

通过一个例子来看一下

比如这条指令我们已经能够

很容易地得出来这条指令的执行结果

SI就等于1100H

好 这条指令的执行结果

就是将SI的值又copy一份

送给了BX 所以它们的执行结果

就是BX也等于1100H

SI也等于1100H

这条指令

目标是累加器AX

而源操作数就是我们正在讲到的基址变址寻址

源操作数大家看了 方括号

所以它是存储器操作数

那么这个数在内存的什么地方呢?

偏移地址是方括号里边的内容

而这个时候方括号里有两个寄存器

那么就意味着偏移地址是两个寄存器的和

所以第三条指令的执行过程就是这样

将DX和SI相加

那么刚才我们说了前边讲的前边两条

指令执行完SI和

BX是一样的

也就是说它们两个相加就等于2200H

因为这个时候基址寄存器选择的

是BX

所以这个源操作数默认是在数据段

那么它的偏移地址

2200H它的执行结果

就是将2200H

和2201H两个单元的内容送给累加器AX

这就是基址变址寻址

和相对寻址一样它也主要用于

一维数组的一种操作

如果我们在这里把这个

BX改成了BP

那么请大家考虑这个时候 虽然

假设BP也是1100

那么这个时候偏移地址也是2200

但是这个时候因为

选择BP的话那么就不会默认在数据段了

而是在堆栈段了

同样的这里也给大家一个题目

你思考一下

如果这个时候方括号里出现SI加DI

或者BX加BP这样的情况

这个指令是不是对的

这一个思考题我先放在这里

好 下面我们来看最后一种有关存储器操作数的寻址方式

叫做基址变址相对寻址

实际上学到现在大家应该已经感觉

到了这个规律

我们总而言之就一句话

存储器的表现形式就是带方括号

这个数在哪里 这个数在内存中的偏移地址

是在方括号里边

就是方括号里边 不管是常数的形式

是一个寄存器的形式 是两个寄存器的形式

还是一个寄存器加常数的形式

总而言是 它们的

最终的和就是偏移地址

那么现在基址变址相对寻址呢

无非是这个偏移地址由三个参量来表示

一个是基址寄存器 一个是变址寄存器

一个是位移量

那么这个时候同样的这个数到底在哪个逻辑段

同样由基址寄存器来决定

基址变址相对寻址因为有三个参量

所以它们的主要应用可以马上就很容易地想到

针对的是二维表格或者二维数组的操作

因为在一个二维表格里边

它会需要一个表头 行地址 列地址

这样三个参量

刚好用这种寻址方式就会

就能够满足要求

我们同样看一个例子

这三行指令

第一行指令执行结果DI等于1100H

第二行指令的执行结果BP

等于DI等于1100H

第三行指令

源操作数是一个存储器操作数

采用的是我们正在学的基址变址相对寻址

也就是说它的偏移地址

是由BP加DI加5

这个常量来构成的

它们合起来构成了源数据

或者是源操作数在内存中的偏移地址

因为这个时候基址寄存器选的BP

所以这个时候的

源操作数默认就在

堆栈段了

那么它们的执行过程或者结果

用图来描述一下

在堆栈区里边

偏移地址是2205H这样一个地方

因为目标是AL表示只传送一个单元

所以就是2205单元里边的值会送给累加器AL

这就是有关存储器的五种寻址方式

这也是我们总体来讲

八种寻址方式中最复杂的五种寻址方式

实际上大家只要

记住我刚才一再强调的那两句话

其实这些寻址方式也就不难理解了

就说首先看见方括号你要想到

数在内存里

在内存的什么地方呢

偏移地址就在方括号里

不管方括号里是什么形式 它永远表示

你要找的那个数它在内存的偏移地址

那么它的逻辑段 段地址到底在哪里

根据你所选择的不同的基址寄存器来决定

最后一种寻址方式我们成为隐含寻址

也可以说是最后一类

隐含寻址我们在前边讲指令格式的时候

已经提到过

它可以指令格式我们说有零操作格式的

有单操作数的 有双操作数的等等

那么单操作数或零操作数

就意味着它的操作对象

全部被隐含或者部分被隐含

那么被隐含的这种操作数我们就称为隐含寻址

隐含的含义就是在这样默认的前提下

我们用一个例子来看一下

这是一条乘法指令这条

指令虽然我们还没学过我们

先拿来做个例子看一下

MUL表示乘法

乘法我们都知道它一定要有

乘数和被乘数

那么在这里它只显示给出了一个操作数

这就意味着它的另外一个操作数

被默认了或者固定了或者说规定了

另外哪个数被规定了呢?

是被乘数

我们显示地给出的这个是乘数

所以这条指令的执行 被乘数默认是AL

乘数是BL 那么相乘的结果或者说乘数的积

被默认在AX里

换句话讲

这条乘法运算指令实际上默认了两条指令

一个是被乘数一个是乘积

而只显示地给出了乘数这样一个对象

有关寻址方式我们就介绍完了

下边我们对寻址方式做一个总体的小结

寻址方式表示指令运算对象的来源

或者运算结果的去向

到底在哪里

有这样几点请大家关注

第一个 请大家注意 立即寻址

仅仅针对的是源操作数

因为这个时候它特指

操作的对象是

立即数也就是指令直接给出的

寄存器寻址表示指令

它的运算对象在某个寄存器中

更多的时候是在某个通用寄存器中

存储器寻址一共有五种 我们

详细地都介绍过

它表示运算的数据是在内存中的

数据在内存中的偏移地址由方括号中

给出 这个方括号里边可能是常数的形式

可能是一个寄存器

可能是一个寄存器加常数的形式

还可能是两个寄存器的形式

还可能是两个寄存器加常数的形式

不管是哪一个形式总而言之方括号里

总和就是这个数的偏移地址

这个数的段基地址到底在哪里?

那么不同的寻址方式有不同的默认规则

存储器寻址和寄存器寻址

都可以用于源操作数也可以用于目标操作数

这个是没有问题的

请大家一定要深入理解寻址方式

因为只有理解了寻址方式 你才能够知道

指令到底是执行了什么

才能够知道指令的执行含义

就像刚才我们看到的那个例子一样

大家那个MOV这个助记符

我们现在应该通过这么多次的练习

都知道它的含义了就是一个传送就是将源

数据送给一个目标地址

但是如果你既不知道源数据

到底来自于哪里 你也不知道目标地址

到底在哪里

你等于不知道这条指令的执行结果

所以寻址方式对大家学习指令是非常非常重要的

为了帮助大家进一步的理解我们下边

再做一个简单的联系

这个题目是这样在这个

题目里大家看出来

题目给出了一堆堆寄存器的值

有ES 有DS 有SS

还有SI BX等等

那么现在下边这条指令请大家要说明一下

源操作数它的寻址方式

并且能够在如果源操作数是

存储器操作数的话 这句话

在题目里没写因为篇幅的原因

就是如果源操作数是存储器操作数的话

请给出这个源操作数的物理地址

因为寄存器不存在物理地址与逻辑地址

这一说 寄存器的地址就是代号就是固定的

这些物理地址逻辑地址什么偏移地址等等

针对的全部都是存储器操作数

好 下面我们看第一条

第一条指令 源操作数肯定是

寄存器操作数

对吧 这没有问题 所以它是寄存器寻址

第二条指令 它的源操作数是常数80H

所以它是立即寻址 这也没问题

第三条指令

它的源操作数是两个寄存器还加了一个常量我们说

题目这里已经说了VAR表示一个常量

是0050H

所以这条指令的源操作数

就是基址变址相对寻址 那么它们的地址在哪里呢?

首先它们的偏移地址 是BX的值加SI的值

加常量VAR就是0050

那么因为这里基址寄存器选择的是BX

所以它们默认在数据段

所以数据段的段地址是6000当然也就

知道数据段的段首地址

是60000

那么加起来这个数的物理地址

就是608F02

好 这条指令

就是基址变址相对寻址

它的物理地址是608F0H

下边这一行指令源操作数有一个单引

号 中间是大写字母B

请大家注意在汇编程序中间

这个单引号

用来表示字符

所以这里边这个大写字母B它的ASK码是42H

所以这个

指令它的源操作数也是立即寻址的方式

再下边一行

我们显然这个源操作数是

寄存器间接寻址

只不过它通过了段重设

重设数据在

附加段里边

所以附加段的段基地址在题目中已经给出是2000H

出来是2000H

所以这条指令 源操作数的物理地址

就是20800H

再下边一条源操作数显然是寄存器间接寻址

只不过这个时候基址寄存器选择的是BP

那么默认的是在堆栈段

所以它的物理地址

就是堆栈段寄存器左移四位加上BP的值

BP等于多少呢?题目中也已经有给出是1200H

所以它的物理地址也很容易得出来

就是16200H

最后一条指令它的源操作数是寄存器相对寻址

这个数据的偏移地址是BX值加20H

所以因为这里基址寄存器选择了

BX所以它默认在数据段

那么它的物理地址也就很容易得出来

好 有关寻址方式我们讲了这么多

就到这里 但愿大家都能理解

微机原理与接口技术课程列表:

第1周 微型计算机基础概论

-第1讲 关于本课程

--关于本课程

-第2讲 微型计算机系统

--微机系统_01

--微机系统_02

-第3讲 微型计算机一般工作过程

--微机的一般工作过程_01

--微机的一般工作过程_02

-第4讲 数制与编码

--常用计数制及其转换

--计算机中的编码

-第5讲 计算机中数的表示与运算

--数的表示

--符号数的表示

--数的表示与运算

-第6讲 基本逻辑运算与逻辑电路

--基本逻辑运算与逻辑门

--常用逻辑运算及电路

-第7讲 本周小结

--本周小结

-第1周 微型计算机基础概论--第一周单元测验

第2周 8088微处理器

-第8讲 8088微处理器

--8088 CPU_01

--8088 CPU_02

-第9讲 8088 CPU主要引线及机构

--8088 CPU主要引线

--8088 CPU内部结构

--8088 CPU内部寄存器

-第2周 8088微处理器--第二周单元测验

第3周 实模式存储器寻址与总线

-第10讲 实模式存储器寻址

--实模式存储器寻址_01

--实模式存储器寻址_02

--实模式存储器寻址_03

-第11讲 8088系统总线

--8088系统总线

-第12讲 微处理器小结

--微处理器小结

-单元测验--作业

第4周 数据传送指令

-第13讲 指令概述

--指令概述

-第14讲 寻址方式

--寻址方式

-第15讲 通用数据传送指令

--通用数据传送指令_01

--通用数据传送指令_02

--通用数据传送指令_03

-第16讲 地址传送指令

--地址传送指令

-第17讲 输入输出指令

--输入输出指令

-第4周 数据传送指令--第四周单元测验

第5周 算术运算、逻辑运算与移位操作指令

-第18讲 算术运算指令

--加法运算指令

--减法指令

--乘除运算指令

-第19讲 逻辑运算指令

--逻辑运算指令_01

--逻辑运算指令_02

-第20讲 移位操作指令

--移位操作指令

-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验

第6周 串操作指令

-第21讲 关于串操作指令的说明

--串操作指令说明

-第22讲 串传送与串比较

--串传送与串比较

-第23讲 串扫描指令

--串扫描指令

-第24讲 串装入与串存储指令

--串装入与串存储指令

-第六周单元测验--作业

第7周 程序与处理器控制

-第25讲 程序控制指令说明

--程序控制类指令说明

-第26讲 转移类指令

--无条件转移指令

--条件转移指令

-第27讲 循环控制指令

--循环控制指令

-第28讲 过程调用指令

--过程调用指令

-第29讲 中断指令

--中断指令

-第30讲 处理器控制指令

--处理器控制指令

-第31讲 指令系统小结

--指令系统小结

-第7周 程序与处理器控制--第七周单元测验

-第7周 程序与处理器控制--第七周作业

第8周 汇编语言程序设计

-第32讲 汇编语言源程序

-- 汇编语言源程序_01

-- 汇编语言源程序_02

-第33讲 伪指令

--数据定义伪指令

--符号与段定义伪指令

--汇编语言源程序结构例

--其它伪指令

-第34讲 系统功能调用

--系统功能调用_01

--系统功能调用_02

-第35讲 汇编语言程序设计示例详解

--程序设计示例1

--汇编语言程序设计示例_02

-第36讲 汇编语言程序设计小结

--汇编语言程序设计小结

-第8周 汇编语言程序设计--第八周单元测验

-第8周 汇编语言程序设计--第八周作业

第9周 半导体存储器

-第37讲 半导体存储器概述

--半导体存储器概述

-第38讲 内存单元编址

--存储单元编址

-第39讲 随机存取存储器RAM

-- RAM_01

--RAM_02

-第40讲 只读存储器ROM

--ROM_01

--ROM_02

-第九周单元测验--作业

第10周 半导体存储器扩展技术

-第41讲 半导体存储器扩展

--半导体存储器扩展_1

--存储器扩展_2

--半导体存储器扩展_3

-第42讲 半导体存储器小结

--半导体存储器小结

-第十周单元测验--作业

-第十周作业--作业

第11周 输入输出与中断技术

-第43讲 基本I/O接口

--I/O系统概述_01

--I/O系统概述_02

-第44讲 简单接口芯片

--简单接口芯片

-第45讲 基本输入输出方法

--基本I/O方法

-第46讲 简单I/O控制系统设计

--简单I/O控制系统设计1

--简单I/O控制系统设计2

-第47讲 中断技术

--中断技术1

--中断技术2

-第48讲 输入输出与中断技术小结

--本周小结

-第十一周单元测验--作业

第12周 可编程并行数字接口

-第49讲 可编程定时计数器

--可编程定时计数器8253_01

--可编程定时计数器8253_02

--可编程定时计数器8253_03

-第50讲 可编程并行接口

--可编程并接口8255_01

--可编程并行接口8255_02

--可编程并行接口8255_03

-第51讲 可编程接口小结

--本周小结_01

--本周小结_02

-第十二周单元测验

第13周 模拟量的输入输出

-第52讲 模拟量的输入输出

--模拟量的输入输出

-第53讲 D/A转换器

--D/A转换器_01

--D/A转换器_02

-第54讲 A/D转换器

-- A/D转换器_01

--A/D转换器_02

-第十三周单元测验--作业

第14周 系统综合设计示例详解

-第55讲 I/O接口系统综合设计示例详解I

--综合设计示例详解I_01

--综合设计示例详解I_02

-第56讲 综合设计示例详解II

--综合设计示例详解II_01

--综合设计示例详解II_02

-第57讲 结束语

--结束语

寻址方式笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。