当前课程知识点:微机原理与接口技术 >  第7周 程序与处理器控制 >  第28讲 过程调用指令 >  过程调用指令

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

过程调用指令在线视频

过程调用指令

下一节:中断指令

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

过程调用指令课程教案、知识点、字幕

这一讲我们来学习过程调用指令

在汇编程序里过程也称为子程序

所以 在这里过程调用指令

也就是用来调用一个子过程

或者说一个子程序的指令

我们拿它和转移类指令做一个对比

来看一下过程调用和转移它的区别在哪里

我们知道程序要想实现转移的话

无论是有条件转移还是无条件转移

都是从这个地方转移到了另外一个地方

然后 转移到目标地址之后

沿着那条路一直走下去

也就是说转移类指令

我们只是要关注它转移的目标在哪里

我们并不关注其他的了

因为到了目标以后CS或者IP和CS都改变了

那么它就一直沿着那条路往下走

但是调用不一样

过程调用我们刚才说

实际上是为了调用一个子程序

为什么要调用子程序呢?

其实往往就是因为

希望程序在结构上显得更简练

我们做一个比喻

比如我们在这个程序里头

我们反复的要去做一个开方的运算

那么我们就完全可以

把这个开方的这段程序编成一个子程序

那么 在我这个时候需要做一个开方的时候

比如要做一个5的开方

我把5送给子程序

子程序计算完了以后把结果返给我

那么我下一次要做8的开方我又把8送过去

它又把结果送给我

所以 这样子的话就会显得程序里头

不是你总是出现同样的一段重复的代码

因此 过程调用指令

它不仅仅要关注子程序在哪里

也就是说我要知道我调用的目标在哪里

或者说我下一条要执行的指令在哪里

我还更多的要关注

我调用完这个子程序后我必须要回来

回来我又不能说我随便找个地方

沿这一个地方执行下去

我一定要记住我刚才从哪里走的

然后我再回到这个地方继续原来程序的执行

所以 和转移类指令比较起来

过程调用指令不仅仅要关注

下一条要执行指令的地址

也就是说转移的目标

还要关注它的返回处

为了记住它的返回处

所以我们必须在走之前我们要

保护好刚才被打断的地方

下面我们用图来描述一下

这个过程调用的整个一个过程或者说它的原理

比如这个是调用程序

或者说我们简单地讲这是主程序

走到这个地方 就是这个黑点的地方

我们需要去调用一个子程序了

那么子程序在哪里呢?

我们首先需要找到这个子程序

然后找到它以后就沿着它一直往下走

执行完以后它要把结果返回来

因此 在过程调用里头

我们和转移类指令比较起来多了一件事

就是第一件和转移指令是一样的

转移类指令我们找的是转移的目标

而过程调用 我们要找的是

子程序的第一条指令在内存中的存放处

这个我们称为子程序的入口地址

多余出来的这一步

也就是说和转移类指令不一样的地方

是我们要记住我们返回的地方

返回的地方我们称为刚才被打断的地方

所以叫断点

请大家一定要注意

这个断点是我们刚才调用指令的

下一条指令的地址

而不是返回到现在图中黑点的这个地方

如果返回黑点的地方我们就相当于又去接着调用了

所以这个是过程调用

大家在学习的时候要注意的一点

因此过程调用指令的执行过程就是这样

第一 它首先要把断点地址压入到堆栈中去保护

这个断点地址

有可能我们刚才调用

程序和被调用程序在同一个代码段

那么也就是说我们在这层楼上并没有走远

那么也就要记住的就是断点的偏移地址

如果我们这两个程序不在同一个代码段

就相当于是远过程调用了

那么这个时候我们不仅要记住断点的偏移地址

还要记住断点的段基址值

这一点倒是跟无条件转移指令是非常像的

然后第二件事 把断点保护好了

也就是记住了我们回家的路

那么下边我们就去找入口了

入口就是子程序

第一条指令在存储器中的存放地址

然后当然找到了那条 找到了入口

也就是说我们等于走进了门 走到门口了

下面就是往里走了

也就是说我们第一条指令的地方都已经找到了

那么我们就下边就沿着这个程序一直执行下去了

完了以后 执行完了以后

我们下边要返回原来的断点处

继续原来程序的执行

这个是过程调用的整个的四个步骤

在这四个步骤里请大家注意

只有这个子程序本身当然是由程序员去编写的

所以它是由软件来实现的

在这个子程序里除了完成相应的功能以外

一般来讲 我们还要做一些相应的参数保护

也就是说 比如我们在子程序里用到了ax bx

那么为了保证不修改人家调用程序中原来ax bx的值

所以在进入子程序之后

我们首先要把ax和bx的值保护起来

怎么保护呢?

我们显然就是把这两个寄存器的内容

压入到堆栈中去暂存

因为堆栈本身它的主要的作用

就是保存一些

这一分钟不用但是又不能丢掉的内容

这个就是所谓的参数保护

当然在使用完了以后

在我们整个子程序执行完了以后要返回之前

我们要把人家原来的内容恢复到ax或者bx里头

这个 就这一部分

显然是由软件程序员来编写程序实现的

其他的工作 比如在这里的断点地址的保护

入口地址的查找

以及最后断点地址的恢复等等这些工作

都是由系统自动来完成的

也就是说虽然它会把这些断点地址

压入到堆栈中

我们未来在真实的实验环境中

大家也能够的确得看得到堆栈区发生的变化

但是这个工作是系统自动完成了

而不是我们用PUSH或者POP指令来完成的

这一点请大家也要注意

好 下边我们就来学习具体的过程调用指令

过程调用一共有两种小的类型

一种是段内调用一种是段间调用

段内调用又分为段内直接调用和段内间接调用

段间调用也同样有分成这样两个小类

这一点倒是跟

我们前面学的无条件转移指令倒是非常的像

因此这里所谓的直接调用和间接调用

就是指指令中到底是直接给出了子程序的入口地址

还是间接地给出子程序的入口地址

直接调用是在指令中直接给出了子程序的入口地址

和我们无条件转移指令一样

这种所谓的直接给出

也就是用一个符号来代表子程序的入口地址

而间接调用就是将子程序的入口地址放在内存中

我们下边先来看一下段内调用

段内调用就是被调用程序

和调用程序在同一个代码段中

用图来描述就是这样

因为这个时候两个程序都在同一个代码段

那么也就是说在去转移到子程序执行的时候

段基地址并没有修改

因此我们不需要再保护或者记住段基地址

我们需要保护的断点地址就是十六位的偏移地址

在内存的什么地方呢?我们来看

因为这个

存储器操作数的寻址方式是寄存器间接寻址

而且间指寄存器选择的是SI

所以说明它在内存的数据段

我们用图来描述是这样的

假设SI等于1200H CS等于6000H的话

那么 我们子程序的入口地址就在数据段中

偏移地址为1200H这个字节单元里头

这条指令执行以后

CS并没有改变 还是6000H

但是IP的值改了

就是1200所指向单元的内容 也就是3344H

这是段内调用

那么段间调用呢?

就是子过程和原调用程序不在同一个代码段

因为这个时候段基地址也改变了

所以子程序的入口地址也变成了32位

要保护的断点地址也是包含了段基地址和偏移地址

也就是说也是32位的断点地址要保护

在内存的什么地方呢?我们来看

因为这个

存储器操作数的寻址方式是寄存器间接寻址

而且间指寄存器选择的是SI

所以说明它在内存的数据段

我们用图来描述是这样的

假设SI等于1200H CS等于6000H的话

那么我们子程序的入口地址就在

数据段中偏移地址为1200H这个字节单元里头

这条指令执行以后

CS并没有改变还是6000H 但是IP的值改了

就是1200所指向单元的内容也就是3344H

这是段内调用

那么段间调用呢?

就是子过程和原调用程序不在同一个代码段

因为这个时候段基地址也改变了

所以 子程序的入口地址也变成了32位

要保护的断点地址也是包含了段基地址和偏移地址

也就是说也是32位的断点地址要保护

32位的断点地址要压入堆栈保护不可能一次性压入

虽然这个压栈保护的工作是系统来完成

它也是按字一个字一个字地压入的

因此 这个32位的断点地址在压入堆栈的时候

需要有一定的顺序

它们的顺序就是先压入的是断点的段基地址

再压入断点的偏移地址

请注意这里的CS和IP

这是为了方便一点

我们用这样的寄存器的符号来代替了

一定要请大家注意

这里不是把CS和IP两个寄存器压栈了

这两个寄存器是器件不可能压进去

只是把它们的内容压入堆栈

我们用例子来说明

这个是段间直接调用的示例

这个TIMRE同样是子过程的名字

因为这个TIMRE这个时候它的前面有个FAR

说明它是段间调用

这是段间的间接调用的例子

同样的和JMP指令一样

在这里

因为CALL指令后面的这个存储器操作数

被声明为DWORD

也就是一个DOUBLE WORD类型的操作数

表示这个存储器操作数是一个32位的存储器操作数

既然CALL指令后边是

子程序的入口地址

而现在呢这个子程序的入口地址放在内存中

并且是一个32位的存储器操作数

说明它就是段间调用

我们用图来描述

这个同样的

这个时候它的存储器操作数的

寻址方式是寄存器间接寻址

间指寄存器选择的是SI 所以它默认在数据段里

那么数据段里四个字节单元中

低地址单元中的内容就是入口的偏移地址

高地址单元中就是入口的段基地址

这个时候把它们拿出来分别送给IP和CS

这样程序就会沿着新的地方继续执行子程序了

在过程调用中间还有一条指令叫返回

这条指令它负责将断点地址弹回到CS IP

或者只弹回到IP

一旦弹回也就是意味着修改了CS和IP的值

那么就返回到原程序继续执行

返回指令的格式是RET

它是一个零操作数格式的指令

这个是RETURN的缩写

不论子程序有多么长

子程序中最后一条指令必须是RET

因为现在子程序的定义

这样的方式我们还没有学到

这些内容要到第四章才学

所以我们在学习完第四章的过程调用伪指令之后

我们将结合这条CALL指令和RET指令

来一起来看一下如何编写一个子程序

好 有关过程调用指令我们就介绍到这里

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

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

--结束语

过程调用指令笔记与讨论

也许你还感兴趣的课程:

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