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

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

地址传送指令在线视频

地址传送指令

下一节:输入输出指令

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

地址传送指令课程教案、知识点、字幕

下面我们学习

数据传送类指令的第三小类 地址传送指令

地址传送 顾名思义 就是来取地址的

这一类指令一共有三条

第一条指令 我们称为静地址指针指令

就是用来取当前数据段中某个单元的偏移地址

所以 取某个单元的偏移地址

肯定他针对的是存储器操作的

下面的这两条叫做远地址指针

这是在多模块程序设计的时候

我们需要到另外一个数据段里去取地址

或者在另外一个附加段里的单元取地址

因为在我们这门课程里

绝大多数情况下设计的都是单模块程序设计

所以下面在介绍这一类指令时 重点介绍第一条

就是LEA指令

LEA指令的操作

就是将变量的16位偏移地址取出来

送给目标寄存器

我们在这里需要说一下变量

所谓变量 是表示内存某个单元的符号地址

所以在这一条指令中间

要取的是变量的偏移地址

意味着源操作数是变量

那么变量既然代表着内存某个单元的符号

那么所以

这个指令的源操作数 一定是存储器操作数

所以当程序中间

用某个符号来代表内存偏移地址的时候

就需要用到这条指令

所以这条指令 在程序中的使用频率是相当高的

基本上可以和MOV指令是一样的

所以这条指令的格式就是这样

他的源操作数 一定是一个存储器性质操作数

而目标操作数 是一个寄存器

什么样的寄存器呢?

当然不可能是段寄存器

因为段寄存器的值一定是段基地址

我们这里前提已经很清楚

LEA指令 就是取的变量的偏移地址

所以目标操作数肯定不能是段寄存器

当然更不可能是控制寄存器

因为FLAGS和IP的内容的含义是非常明确的

所以这里的目标寄存器一定是8个通用寄存器之一

但是从后边的学习 大家会理解

这里的通用寄存器 在理论上8个寄存器都可以(通用)

但是最好还是选4个兼职寄存器之一

因为我们把变量的偏移地址取出来的目的

实际上是为了后边修改指针的方便

为什么要修改指针?

我们在寄存器间接寻址里 已经提到过

就是因为 如果用寄存器间接寻址的话

我们可以实现BX++这样功能的指令

就是我们在上节课看到的第一段指令INC

因为有了这一条指令

我们才能很方便的修改指针

那么修改指针的目的就是为了间接寻址

而间接寻址能够用来表示

偏移地址的寄存器只有那四个BX BP SI DI

所以 在这里为了后续编程的方便

LEA指令的目标操作数最好是四个兼职寄存器之一

下面我们用MOV指令作为对比

来看一下LEA指令和MOV指令在执行结果上的不同

由此帮助大家理解LEA指令的执行原理

假设用符号i来代表这个内存单元的地址

这个符号i我们也称为变量

并且假设他在事先被声明过

那么 执行这条MOV指令之后

因为MOV指令读取的是内存单元的内容

所以他的执行结果AL=4

也就说 MOV指令读取了i变量所指向单元的内容

因为i作为变量 事先一定被声明过

一旦声明 他就会有个确定的值

到底这个值等于多少?

我们到第四章学习时 大家就清楚了

所以 他既然有一个确定的值

那么在这个MOV指令中

源操作数i就属于直接寻址方式

我们来看 如果执行这条LEA指令

他会有什么样的执行结果

因为LEA指令取的是内存单元的偏移地址

那么现在 内容为4的内存单元的偏移地址是几呢?

他的偏移地址就是i

所以这条指令的执行结果BX就等于i

同样的前面说过 i一旦被声明 肯定有个具体的值

所以这条指令执行完后 BX也会有一个具体值

由此我们可以感觉到

MOV指令 读取的是内存单元的内容

而LEA指令 读取的是单元的地址

我们再来看两个例子

在这里 DATA1表示的是内容为34H单元的地址

也是一个符号地址

这条指令目标操作数是SI 是一个16位的寄存器

所以这条MOV指令执行之后

SI会等于

DTAT1所指向字单元的内容 也就是1234H

那么如果改成LEA指令的话

刚才我们说了

LEA指令读取的是内存单元的地址

而MOV指令读取的是单元的内容

那么这个单元的地址是多少呢?就是DATA1

所以这条指令的执行结果SI就等于DATA1

我们下边用一个具体的

包括数字的指令来进一步说明LEA和MOV指令

它们执行上的区别

这两行指令 第一条指令的执行结果BX=1100H

第二条指令

因为BX作为兼职寄存器

所以 这个1100H就变成了偏移地址

这条指令的执行结果

就是将当前数据段中 偏移地址为1100H

所指向的字单元的内容送给AX

所以AX中的内容就等于7788H

那么如果继续执行这条LEA指令的话

我们知道 LEA指令读取的是单元的偏移地址

而现在呢

这个源(存储器)操作数的偏移地址等于多少呢?

就是BX的值

而BX现在就等于1100H

所以这条指令的执行结果BX=1100H

由此我们就应该理解了LEA指令的执行原理

下边我们通过一个题目

来看一下LEA指令在程序中的运用

这个题目是这样

将数据段中首地址为MEM1的50的字节的数据

传送到同一逻辑段

也就说还是当前这个数据段

但是首地址为MEM2的区域中存放

在这里因为是将MEM1为首的50个字节的数

传到以MEM2为首的区域中

所以我们也把MEM1称为原地址

而把MEM2称为目标地址

做这样的题目 我们用朴素思维来考虑一下

首先我们要知道源的头地址在哪?就是MEM1

也要同时知道目标的头地址在哪里?就是MEM2

第二我们要知道要传送多少个数据?

这里要传送50个字节

我们可以按字节传送 也可以按字传送

如果按字节传送 需要传送50次

按字传送 就只传送25次

另外要考虑到

MOV指令不允许内存到内存之间的直接传送

所以每传送一个字节 或者每传送一个字

都需要两条MOV指令来实现

下边我们用流程图的方法

描述一下这个程序的算法

流程图通常用一个带圆弧的矩形框表示开始

开始框通常没有具体含义

根据刚才分析 首先要把原地址和目标地址确定

也就说 他们的偏移地址要取出来

这个显然就用到了LEA指令

然后我们要确定整个数据的长度

50个字节就是他的长度值 如果按字节传送的话

我们可以把这个长度值送个CL

当然也可以送给其他的通用寄存器

这三个框合在一起 也可以称为初始化的工作

把这个初始化工作做完之后

我们就可以实现一个字节的传送了

传送完一个字节之后

下边就准备传送第二个字节

所以 为了保证真正传送的是第二个字节

而且是把第二个字节传送到了目标的区域中

所以我们这里 一定要完成地址指针的修改

同时保证传送正常结束

所以每传送完一个字节

一定要把数据块长度值减1

然后判断 长度值减到0了没有

如果没有减到0 那么继续传下一个字节

大家请注意 这个就是循环程序的结构

因为在循环回去的时候

刚才地址指针已经被修改了

所以在接着传送的时候

传送的是第二个字节的内容

直到计数值等于0 那么整个工作就结束了

这就是这道题目的控制流程

下面我们对应着控制流程 用代码来实现

这就是要做的内存区域的分布情况

首先用LEA指令

将原数据的偏移地址MEM1读取到SI

目标区域的首地址MEM2读取到DI

然后把数据块的长度值50 送给CL

下边 用两条MOV指令实现了第一个字节的传送

传送完后 需要修改地址指针

也就是将SI加1 DI加1

为下一次传送做好准备

因为传送完一个字节的数据了

所以下边我们把长度值减1

之后判断 如果长度值不为0

如果CL不等于零 则转移到NEXT

继续传送下一个字节的数据

这几条指令虽然我们还没有学过

但是在上一段MOV指令例子里已经看到过了

他们属于算术运算类指令

前三条主要就是修改地址指针

和修改计数值的长度

而这一条指令

我们称为条件转移指令

他是使CL不等于零的时候

就会控制程序转移到NEXT继续执行

LEA指令所针对的变量是一个静地址指针

也就说他是在当前数据段中

所以不考虑段基地址 仅仅取了变量偏移地址

而LDS和LES都是远地址指针

也就是说 他所针对的变量在另外一个逻辑段里

所以这个时候

不仅仅要考虑变量的偏移地址

还要考虑变量的段地址

LDS的格式是这样的

这条指令的执行结果

是将这个存储器的偏移地址

送给他的目标寄存器

并且把这个 存储器操作数的段地址送给DS

所以

这个存储器操作数事实上是一个32位的操作数

LES的格式和LDS是类似的

只不过在这里

除了把源操作数的偏移地址送给寄存器之外

还会把源操作数的段地址送给ES

这就是他和LDS唯一的区别

因为着两条指令在程序中用的并不多

所以在这里只做简单的介绍就可以了

通用数据传送的最后一个小类叫标志传送指令

这一类指令在程序中的使用频度比较低

所以我们简单的给大家介绍一下就可以了

这一类指令一共有4条

我特意把这些英文全称打在这里

大家先看下边这两条

这两条实际上就是PUSH和POP

只不过 因为PUSH和POP的对象 默认是FLAG

或者说 默认是标志寄存器

所以着两条指令 都是零操作数格式的指令

他们把F写在这里

PUSHF表示把标志寄存器的内容

压入到当前栈顶位置

POPF把当前栈顶的内容弹出到FLAGS寄存器

因为PUSH POP我们已经很详细的介绍过了

所以这两条指令就不再赘述了

上面着两条指令是

AH和标志寄存器之间相互操作的指令

所以它默认的对象

就是标志寄存器FLAGS和AH寄存器

我们下边简单描述这两条指令的执行原理

LAHF的意思

就是将FLAGS低8位的内容送入到AH中间

我们说FLAGS是一个16位寄存器

但是它里边是按位定义的

他一共只有9个标志位 其他的7个是空闲位

那么 这9个标志位里

低8位里一共有这样5个标志位 处于低8位的位置

所以 LAHF的操作

就是将低8位里这5个标志位的状态

同时传送给AH

传送给干什么呢?实际上作为保存的作用

那么反过来 SAHF就做了一个相反的操作

也就将AH内容写回到FLAGS低8位中

这就是整个数据传送类的四个小类指令

我们就介绍完了 我们做个简单的回顾

这一大类指令一共分了四个小类

在学习的四小类全部指令中间

MOV指令 堆栈操作指令

以及取偏移地址的LEA指令

以及IN和OUT这两条输入输出操作指令

是使用频度相当高的指令

所以这些指令 请大家一定要熟练掌握

其他的 比如查表指令 EXCHANG指令

虽然他们使用频度也不算太低

但是他们完全可以用MOV指令

或者PUSH POP指令来取代

所以它的重要性相对打一点折扣

还有两条远地址指针的取地址指令

即LDS和LES 还有现在这两条指令

因为他们在程序中 特别在我们课内程序中

使用频度都是非常低的

所以大家作为一般的了解就可以了

数据传送指令我们就学习到这里

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

第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讲 结束语

--结束语

地址传送指令笔记与讨论

也许你还感兴趣的课程:

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