当前课程知识点:微机原理与接口技术 > 第4周 数据传送指令 > 第15讲 通用数据传送指令 > 通用数据传送指令_02
在数据段区的最左边这一列没有给出
DS具体等于几
DS的值在未来里寄存器区大家可以看得到
那么在这里用DS冒号来表示
就表示现在这个区是数据段区
我们看第一行的第二列
DS冒号后边是1000
这个就是现在偏移地址
那么这个同样地是用十六进制来表示
所以写完之后我们一直从1001开始到1063H结束
全部都是2AH
这就是我们这段程序编写完代码段区的情况
及执行完数据段区的情况大概就是这样
先大家一个感性的认识
有关MOV指令的学习我们就讲到这里
MOV指令在程序中间的使用频率地相当高
每一段程序肯定都会涉及到数据的传送
所以MOV指令会出现在未来每一段程序中
当然这条指令大家是一定要熟练掌握的
下边我们来学习通用数据传送中的第二小类
就是堆栈操作指令
堆栈操作指令是专门针对堆栈操作的指令
在讲具体的指令之前我们先来
一下堆栈操作的原则
堆栈操作的基本原则是这样
首先是先进后出
这是所有栈的基本的原理或者要求
第二条是我们汇编指令对堆栈指令的基本要求
就是它的每一次操作都是以字为单位的
在十六位计算机系统中间
一个字的长度就是两个字节
以堆栈指令的操作数一定是十六为的操作数
绝不可能是八位操作数
堆栈操作指令一共有两条
一条是压栈指令 一条是出栈指令
它们的指令助记符都非常形象
入栈指令的助记符是一个PUSH
它后边是单操作数 出栈指令的助记符是POP
后边也是单操作数
它们两者后边显示给出的操作数可以是
十六位的寄存器或者是内存两个单元
PUSH指令的执行是将一个十六位的数押入堆栈
我们在前面的课程里已经介绍过
堆栈可以形象的认为像箱子一样
我们向箱子放东西
有两个特点 第一箱子里要有空间
第二肯定是先放进去的在最底下
所以PUSH指令就相当于我们在箱子里放东西一样
所以它的执行过程是这样
首先我们要确定堆栈是有地方的
堆栈有没有空间是取决于栈顶的位置
如果栈顶现在和栈首是重合了
那么我们这个堆栈就满了
如果栈顶和栈底是重合的
那么我们这个栈就是空的
那么如果我们要向堆栈放东西
那么我们就相当于要首先腾出一个空间一样
怎么个腾出法呢 它的执行过程是这样子
首先我们将SP减二
堆栈的操作我们知道是从底下往上上
假如我们底下是高地址
上面是低地址,那么我们就把它减二
相当于腾出了两个字节的空间
然后我们就向里压入一个十六位数
当然高字节就是高八位压入到高地址
然后低八位压入到低地址
这样子我们一次PUSH操作就结束了
这就是PUSH指令的一个操作的基本过程
我们用一个事例来描述一下
设我们有一个这样的条件 AX=1234H
SP=1200H 我们来执行PUSH AX指令
看一下它的执行过程
我们用图来描述
就是在执行这条PUSH指令之前
SP是1200H 这就是当前的栈顶的位置
假设我们在前面还有空间 那么在执行之后
首先SP要减二
1200H减二等于多少呢?
就是11FEH 然后把AS压入堆栈
其中 AH就是12H压入到新的栈顶地址加一的位置
然后把AL压入到新的栈顶指针所指向的位置
执行结束之后
现在新的堆栈的情况是这样
栈顶指针等于11FE
栈顶指针里边所指向的字单元的内容是1234H
这是PUSH指令 那么我们来看看POP
POP是将栈顶的位置弹出到POP指令
所指向的那个目标里去
所以 在POP 指令的执行过程就是这样
首先它将栈顶地址里边的一个单元的内容弹出来
然后SP加一 向下移动一个
再把下边一个单元字节的内容弹出来
一个字的内容弹出之后
我们SP再加一 这就是新的栈顶
所以POP指令就是将当前栈顶的内容弹出
然后 弹出相当于对它做了一个读操作
把它读出来了 我们说过 读是一个非破坏性的
也就相当一个COPY粘贴的工作
所以实际上读完以后
最初SP所指向的字单元还是原来的值
但是POP执行完SP加二了
所以新的SP在下边这个地方
就是从栈操作这个角度来讲
刚才那两个字节单元的内容我们就视而不见了
就认为不存在了
下边我们在做压栈操作的时候
我们说 实际上SP减二往上走 然后新的数据下去
这样子就把刚才那两个数覆盖了
这个就是我们堆栈操作
PUSH和POP的基本执行原理
POP我们也来用一个例子来看一下
假设我们执行一条POP AX
如果刚才假设我们已经做了一个PUSH 的操作
AX等于11FE的话
那么POP以后
就把这两个字节单元的内容弹出来给AX
那么新的栈顶就是11FE加2
就等于1200H
这就是POP指令的执行
从刚才这两个例子以及我们的描述中
大家应该能够感觉到 堆栈操作要注意的几点
一个 堆栈操作指令 不论是PUSH指令还是POP指令
它的操作数都必须是十六位的操作数
这个十六位的操作数可以是十六位的寄存器
或者是内存两个单元
当然寄存器没有问题 它的字长CPU非常清楚
AX是十六位 BX也是十六位
但是存储器我们知道内存很大
所以存储器操作数的字长实际上是不确定的
虽然你可能认为PUSH和POP指令规定
存储器操作数必须是十六位
但是作为编译器来讲它不能确定
所以所有的存储器操作数
我们必须要说明一下它的字长到底是多长
这个说明的办法我们到后边再来给大家解释
这里我们先给大家一个约定
就是我们所有的单操作数格式的指令
对操作数有两点共同的要求
第一如果它是存储器操作数
必须要申明它的字长
第二显示给出的单操作数不能是立即数
为什么 我们来简单的讨论一下
我们回忆我们刚才讲的PUSH和POP
我们说PUSH指令后面显示给出一个操作对象
POP指令后面也显示给出一个操作数
那么这两个操作数的性质是什么呢
我们来看 PUSH是将一个数压入到栈顶的位置
所以在PUSH指令里边
我们显示给出的那个操作数是原操作数
我们的目标就是当前的栈顶的位置
像刚才那个例子 PUSH AX
所以就是将AX值压入到当前栈顶位置
因为栈顶地址已经是一个规定的地方
所以我们就不再显示地给出来而采用隐含的方式
所以我们只显示给出来源
那么POP指令呢 POP指令是一个弹出
就是从栈顶地址弹出数据的一个指令
所以它的原操作数是栈顶
那么目标就POP后边显示给出的操作数
所以在这两条指令里头
它所显示给出的单操作数一个是源一个是目标
我们已经讲过立即数它只是一个常数
它没有地址的含义
所以它绝对不能作为目标操作数
所以POP指令的目标操作数肯定不能是立即数
POP指令后边的那个操作数 因为它是原操作数
好像可以用立即数来表示
但是实际上也不行
在8086指令系统里
所有单操作数格式的指令
它对操作数有这样两个共同的要求
第一绝对不能是立即数
第二如果是存储器操作数必须申明它的字长
这是所有单操作数指令有这样一个共同的要求
后边我们不在强调这一点
因为CS是代码段的段地址
实际上直接决定着程序代码的走向
所以我们不能从栈顶里面弹出一个字
给CS 也就是说
不能有POP CS这样的指令
理论上PUSH CS 是可以的
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语