当前课程知识点:微机原理与接口技术 >  第8周 汇编语言程序设计 >  第33讲 伪指令 >  其它伪指令

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

其它伪指令在线视频

其它伪指令

下一节:系统功能调用_01

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

其它伪指令课程教案、知识点、字幕

大家好

这一讲我们来继续学习其他的一些伪指令

我们前面已经学习完了我们这七种类型

伪指令中间的前面的四种

就是说数据定义伪指令 符号定义伪指令

段定义伪指令和结束伪指令

这四类伪指令学习完了之后

我们实际上就可以具备

完成一个最基本的最简单的

汇编语言源程序的一个设计

我们在前面上一讲中我们也给了大家

一个具体的示例框架

那么今天呢

我们来继续学习其他的三类伪指令

也就是过程定义伪指令 宏命令伪指令和

调整偏移量伪指令

说一句就这些伪指令呢

完了以后我们可以

比如可以来定义子程序

可以来声明宏等等这样一个工作

这些伪指令并不是

8086指令集中全部的伪指令

它是最基本的一些

或者说最主要常用到的一些伪指令

好 下边我们就来看过程定义伪指令

过程定义伪指令顾名思义就是用来定义一个子过程

或者说在我们这样一个

汇编这样一个低级程序语言中

我们就叫它子程序

它的格式是这样

这个伪指令的助记符叫PROC

它的头是PROC 它的尾是ENDP

它的前面一定要有过程名

这个过程名的取名规则

它的基本的一些原则符合我们标号的一些

定义的原则

这个大家在前面我们

介绍的时候已经给大家简单的提到过了

比如不能超过32个字符等等这些要求

当然我们在这里给大家一个建议

还是最好大家自己编程序的时候以按意取名为好

这样的话就是说

你比如起个ABC最后你自己也搞不清它是什么意思了

如果你取个DELET你一下就感觉到它

可能是一个延迟的意思

这个过程名除了

它标识这个子程序

就是说它是一个子程序或者一个过程的标识之外

它还有一个很重要的一点

就是过程名实际上就是这个过程的入口地址

也就是说它是这个子程序第一条指令

在内存中的符号地址

在内存中的符号地址

这个非常的重要

PROC和ENDP中间

这就是过程体

PROC

这个伪指令助记符的后边有参数

NEAR或者FAR

这个表示这个过程体它的性质

如果这个过程体是近过程体的话

这个NEAR是可以缺省的

但是如果它是一个远过程体

那个FAR是必须要有的

所以也就是说默认情况下也就是后面没有参数的时候

默认就是近过程体

不管你的过程体有多长

完成什么样的功能

整个过程体的最后一条语句必须是RETURN

这条指令千万不可缺省

RETURN指令负责

返回断点

也就是说我们在前面讲过程调用的时候我们讲过

执行一条过程调用就是CALL指令的时候

系统要完成两件基本的工作

第一保护断点 第二找入口地址

那么入口地址现在我们知道

它实际上就是去看过程名

如果找到这个过程名

那么好 这个入口地址就找到了

那么它保护断点地址是怎么保护的呢?

是系统自动的把CALL指令的下一条指令的偏移地址

或者偏移地址 段基地址

压入到堆栈里头去

那么RETURN这条指令呢

它就是负责返回到断点

也就是说负责

把断点刚才压入堆栈的那些断点地址

又恢复到IP或者IP和CS中

所以如果没有这条指令

这个子程序将无法再返回到

调用程序了

所以这个请大家一定要注意

下边我们来看一个过程调用的例子

我们定义一个延迟子程序

因为它是做延迟的 所以我们取个名字就叫DELAY

我们PROC ENDP就是头和尾

这个就有点类似于我们高级语言程序中的

比如C++里面的一对花括号 对吧?

左花括号和右花括号 就是有点类似这个意思

现在这个PROC的后边没有NEAR也没有FAR

那么我们刚才讲它缺省的情况下就是NEAR

这说明它是段内调用

这个头和尾有了以后我们刚才强调

大家不管编这个子程序有多么长多么短

最后一条指令一定要有

所以这个RETURN就要先写出来

在通常情况下我们编写一个子程序

我们希望被自己来用

我们实际上也希望被大家来用

这就是类似于今天我们的那些函数一样

大家这些函数可能不仅仅被你用

可能有被很多人来用

那么调用者

调用你这个子程序的那个调用程序

到底是谁编的?到底是怎么编的?

到底人家有哪些寄存器被用到?哪些没有用到?

实际上你作为编子程序的人

你并不一定要非常的清楚

所以为了能够让你的子程序具有

更大的一个 更好的一个通用性

所以我们通常建议大家进到子程序之后

第一件事要完成的就是参数保护

这个保护的原则就是

你子程序比如用到了某些寄存器

为了不影响调用程序原来

这个寄存器中的值

所以你在执行子程序之前

要把原来这个寄存器的内容保护起来

怎么保护呢?当然这个时候

是你编程序 所以你需要用PUSH指令来保护

所以下边我们就用这两条PUSH指令

将需要用到的寄存器的值

压入到堆栈中

当然保护完了以后你最后目的是要

要给人家还原

所以最后一定还要有恢复

这个是实现一个参数保护 所以我们一定要符合

先进后出这样的一个原则

而且必须PUSH和POP要成对出现

这个大家注意一下

好了 这些注意完成之后

下边我们就是一个延迟子程序的一个

功能了

这个功能就很简单 怎么样实现一个延迟呢?

作为一个软件来实现延迟

或者说一个定时的

软件延时和定时在这里是很相关的

那么

实现这样一个功能无非就是反复的去执行

同一段代码

这样的话就等于浪费一些时间就可以了

反复的执行一段同样的代码

无非就是循环结构

那么所以下边我们就

用了这样一个

两重循环的结构来实现一个定时

这个定时程序

做了什么工作呢?实际上就把最中间的两行代码

就是NEXT所指向的代码和W10M所指向的代码

被执行了2乘4167次

然后

到底花了多少时间呢?

那这条程序在不同的宿主机上

所运行的时间肯定不一样

就是你的计算机它的配置环境

你的CPU的这个中频等等主频这些到底是多少

那么这些指令它会运行的时间是不一样的

大然没一条指令它占了多少个周期

或者它的字长是多少 这是确定的

但是它在不同的机器上

它肯定运行的时间是不一样的

好了 编写了这样一个延迟子程序之后

我们在调用程序里怎么用它呢?

那就变得很简单了

就是这样一条CALL指令

CALL后边DELAY就是这个

子过程的名字 也就是它的入口地址

也就是当我们执行完这个CALL DELAY之后

程序就会自动的走向DELAY这个地方

去执行它里面的第一行指令PUSH BX

好 这就是过程定义伪指令

那么我们下边来看

第二个就是宏命令伪指令

什么是宏呢?

“宏”我们说源程序中由汇编程序

能够识别的

具有一定程序

具有一定独立功能的一段程序

它的作用就是当你的源程序中

如果反复的有一个功能

要在这个源程序中反复的用到

为了减少代码的编写量

我们通常把这个反复用到的这一段程序

我们定义为一个宏

那么我们在需要完成这个功能

或者需要用到这个功能的时候我们

去引用这个宏就可以了

从这个定义上我们可以看出来

似乎和我们刚刚讲的

子程序的那个非常的类似

它们确实有一些相通的地方

它们相近的地方就是都是一个有

独立功能的程序段

但是它们又是完全不同的两种类型

子程序

首先肯定是完成一个独立功能的程序段

而且通常情况下这个所谓的独立功能

不是简单的两三行语句

而是相对要多一点的语句

主要的特点是子程序

它你一旦编程一个子程序以后

它通过编译链接之后

就在我们这里通过汇编链接之后

它能够成为一个

可执行的文件独立的存在

这就相当于我们现在在

高级语言的函数库里的各个函数

就是你张三你的程序可以来调用

李四程序也可以来调用

你的程序一可以来调用 你的程序二也可以来调用

也就是它就相当于仓库里的零件一样

大家都可以拿来用

但是宏虽然它也是一个独立的功能模块

在形式上来讲

这个独立的这一段程序呢

它通常比较短

再一个它最本质的和子程序的不同

就是它不可能

通过编译连接而成为一个可以

独立运行的程序

也就是说它不是一个独立的程序

它只能和源程序在一起

只能是这个源程序的一部分

也就是你在这个源程序里所声明的宏

只在你这个源程序里是有效的

在别的源程序里就无效了

所以它不可能独立存在

这个是它和子程序最主要的一个区别

好 下面我们来看一下宏命令伪指令

用它来怎么声明一个宏

这个伪指令的助记符叫

MACRO是头

ENDM是尾

MACRO这个前面要有宏命令名

这个取名规则和子程序的取名规则

和标号的取名规则都是类似的

但是请大家注意在这个ENDM

就是它结束的前面是没有宏命令名的

这个一个形式上的和子程序定义的不同

再一个呢

中间当然这个点点点我们就叫做宏体

再一个MACRO的后边

我们看到有一个形式参数

也就是说

宏的应用刚才我们说 它和子程序不同

因为子程序可以作为一个独立的程序模块来存在

而宏它不能够这样

所以它在声明的时候

或者说调用这个宏的时候

它是通过参数传递来引用的

所以宏的后边通常都是一些形式参数

那么怎么用呢?我们用一个例子来说明一下

大家可能就理解了

比如我们现在在

某个源程序里我们声明了一个宏

这个宏的名字叫DADD

MACRO这个助记符

伪指令助记符的后边有三个形参

XYZ

在这个宏体中有三行指令

这个三行指令很简单大家一眼就能看出来

这个宏体的功能

就是实现X加Y把结果送给Z

那么我们声明完这个宏以后

我们在源程序里怎么样

引用它或者怎么样调用它呢?

我们的调用格式是这样

我们把宏的名字放在前头 比如DADD

然后后边

我们用一一对应的实参

来取代前面这个XYZ这样的三个形参

请大家注意形参和实参必须是一一对应的

你这边有三个形参后边就有三个实参

在这里的三个实参就是DATA1 DATA2和SOME

当然大家学到现在大家已经知道

这个DATA1 DATA2 SOME

肯定是变量了

肯定在前面的数据段或者附加段里是要声明的

那么一旦声明了它们就有实际的值

所以当你调用的时候你

DADD写了这么一行

宏命令名

后面三个实参一写

你的源程序在编写的时候

这就OK了 就结束了

但是你的源程序经过汇编

或者说经过编译之后

它会变成一个什么形式呢?

它会把这个你所调用宏的这样的

一行语句

用宏体来取代它

我们这个过程叫宏展开

也就是展开之后

这个实参就取代了前面的三个形参

就变成了现在的这样的形式

也就是说DATA1送给了AX

DATA2和AX的值相加

然后最后把相加的和送给SUM

这个叫宏展开

所以如果你的源程序里

比如有多个地方要

要做一个X加Y等于Z这样的一个工作

那么你就可以先声明一个宏

然后再所有需要做这样的两数求和

这样的功能的时候

你用这样的不同的实参

去取代这个X和YZ

这样就是说你没有

完全没有减少你源代码编译之后的容量

但是你减少了你书写的容量

就是说你写的时候

不要在每一个地方都写这样的三行语句

而是用一行语句就可以了

这个就是宏它的含义

好 最后一个伪指令我们叫调整偏移量伪指令

调整偏移量伪指令它的主要的作用

就是可以调整程序或者变量

在逻辑段中的起始 偏移地址

因为我们知道在默认的情况下

不论是代码段中的程序

还是在数据区里边的变量

它的起始偏移地址

也就是第一个变量它的偏移地址都是0

这就是前面我们讲的时候我说过

就一栋大楼里头

每一层楼它的第一个房间编号

通常是从1号开始编

它不会从88号开始编 是吧?

那么就是在你的数据段里头

你的第一个变量在默认情况下它的起始偏移地址是0

但是有时候我们实际上需要设定

每一个变量

它的偏移地址

或者我们需要设定

你这一堆变量第一个变量它的起始偏移地址

在这种情况下我们就需要用到调整偏移量伪指令

这个伪指令的助记符叫ORG

就是初始这样一个ORIGINAL它的一个缩写

它可以改变

这个程序或者变量的起始偏移地址

我们具体来看一下它的格式

它的格式是这样

ORG这个伪指令的后边是表达式

这个表达式它当然就有运算符

但是这个不管它是什么样运算

最后它的结果一定是要一个非负的常数

我们看一个例子

比如这样一个DATA这样一个SEGMENT

我们定义这么一个数据段

假设这个数据段里我们就定义了一个变量BUFF

这个BUFF如果没有

这个前面这个ORG的话 这个BUFF的偏移地址

默认是0

但是因为前面有这样一个伪指令ORG

后边ORG中间后面这个

是一个常数是1200H

那么有了这样以后 这个BUFF的偏移地址

就变成1200H了

这个会给我们后边的程序设计

带来一些

带来很多的便利

好 有关我们伪指令这一部分的内容

我们就介绍到这里

下边我们会在下一讲里头

我们会给大家介绍我们整个这一章里的

或者说这一周里的第二个?

很重要的点就是系统功能调用

之后我们会通过一些示例

来帮助大家理解汇编语言源程序的的设计

以及它整个设计的过程

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

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

--结束语

其它伪指令笔记与讨论

也许你还感兴趣的课程:

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