当前位置:文档之家› 第3章指令系统与寻址方式

第3章指令系统与寻址方式


3.3 栈(续)
• 栈有两个基本的操作:入栈和出栈。
– 入栈:将一个新的元素放到栈顶; – 出栈:从栈顶取出一个元素。
• 栈顶的元素总是最后入栈,需要出栈时, 又最先被从栈中取出。 • 栈的操作规则:LIFO (Last In First Out,后进先出)
3.3.1 CPU提供的栈机制
• 现今的CPU中都有栈的设计。 • 8086CPU提供相关的指令来以栈的方 式访问内存空间。 • 这意味着,我们在基于8086CPU编程 的时候,可以将一段内存当作栈来使 用。
3.2.2字的传送(续)
• 问题:内存中的情况如右图,写出下面指 令执行后寄存器ax,bx,cx中的值。
• 思考后看分析。(单步跟踪)
3.2.2 字的传送(续)
3.2.2 字的传送(续)
• 问题:内存中的情况如右图,写出下面指 令执行后寄存器ax,bx,cx中的值。
• 思考后看分析。(单步跟踪)
• 是8086CPU中最关键的寄存器,它们指示了CPU当前要 读取指令的地址。
CS代码段寄存器
• 存放代码的段地址;
IP指令指针寄存器
• 存放代码的偏移地址。
3.1.1 8086PC取指过程
(1)从CS:IP指向内存单元读取指 令,读取的指令进入指令缓冲器; (2)IP = IP + 所读取指令的长度, 从而指向下一条指令;
3..1.5代码段
• 如何使得代码段中的指令被执行呢? • 将一段内存当作代码段,仅仅是我们在编 程时的一种安排,CPU 并不会由于这种安 排,就自动地将我们定义得代码段中的指 令当作指令来执行。 • CPU 只认被 CS:IP 指向的内存单元中的内 容为指令。 • 所以要将CS:IP指向所定义的代码段中的第 一条指令的首地址。 • CS = 123BH,IP = 0000H。
问题分析
3.2.3 mov、add、sub指令
• add和sub指令同mov一样,都有两个操作 对象。
• 它们可以对段寄存器进行操作吗? (请自行在Debug中试验)
3.2.4 数据段
• 前面讲过,对于8086PC机,我们可以根据 需要将一组内存单元定义为一个段。 • 我们可以将一组长度为N(N≤64K)、地 址连续、起始地址为16的倍数的内存单元 当作专门存储数据的内存空间,从而定义 了一个数据段。 • 比如我们用123B0H~123B9H这段空间来存 放数据:
见附录A
3.1.4汇编指令举例
• 数据传送指令
– Mov指令
• 算术运算指令
– Add指令 – Sub指令
• • • •
逻辑运算指令 字符串处理指令 控制与转移指令 处理机控制指令
3.2指令的存取
指令在什么地方? 指令和数据有区别吗? 怎么取下一条指令? 怎么取数据?
3.2指令的存取
CS和IP
mov 指令 还可以将一个内存单元中的内容送入 一个寄存器。
从哪个内存单元送到哪个寄存器中呢?
mov指令的格式:
• mov 寄存器名,内存单元地址
“[…]”表示一个内存单元, “[…]”中的0表示内存单元的偏移地 址。 那么内存单元的段地址是多少呢?
执行指令时,8086CPU自动取DS中的数据为内存单元的 段地址。 如何用mov指令从10000H中读取数据?
– 段地址:123BH – 长度:10字节
3.2.4 数据段(续)
• 如何访问数据段中的数据呢?
• 将一段内存当作数据段,是我们在编 程时的一种安排,我们可以在具体操 作的时候 ,用 ds 存放数据段的段地址 ,再根据需要,用相关指令访问数据 段中的具体单元。 • 示例
3.2.4 数据段(续)
• 我们将123B0H~123BAH的内存单元定义 为数据段,我们现在要累加这个数据段 中的前3个单元中的数据,代码如下:
小结(续)
• (4)在内存和寄存器之间传送字型数据 时,高地址单元和高8位寄存器、低地址 单元和低8位寄存器相对应。 • (5)mov、add、sub是具有两个操作对象 的指令。jmp是具有一个操作对象的指令 。 • (6)可以根据自己的推测,在Debug中实 验指令的新格式。
3.3 栈
• 我们研究栈的角度: 栈是一种具有特殊的访问方式的存储 空间。它的特殊性就在于,最后进入 这个空间的数据,最先出去。 • 可以用一个盒子和3本书来描述 栈的操作方式
• 1011 0000 0000 0111 B • B007H • 把数“7”送到AL中。 • 0000 0100 0000 0011B • 0403H • 把数“3”与AL内容相加,结果放在AL中。 • 1010 0010 0101 0000 0000 0000B • A25000H • 把AL中的内容送到地址为5的存储单元中。
3.1.5 代码存放的地方-代码段
• 对于8086PC机,在编程时,可以根据需要 ,将一组内存单元定义为一个段。 • 可以将长度为 N( N≤64KB )的一组代码 ,存在一组地址连续、起始地址为 16的倍 数的内存单元中,这段内存是用来存放代 码的,从而定义了一个代码段。
3.1.5代码段
例如
• 这段长度为 10 字节的字节的指令,存在从 123B0H~123B9H的一组内存单元中,我们就 可以认为,123B0H~123B9H这段内存单元是 用来存放代码的 ,是一个代码段 ,它的段地 址为123BH,长度为10字节。
3.1.4修改CS、IP的指令
在CPU中,程序员能够用指令读写的部 件只有寄存器,程序员可以通过改变 寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS、IP中的内 容决定的,程序员可以通过改变CS、 IP中的内容来控制CPU执行目标指令。
我们如何改变CS、IP的值呢?
3.1.4修改CS、IP的指令
3.2.1 数据存取
• 问题:
写几条指令,将al中的数据送入内存单元10000H? (思考后分析)
• 分析问题本质:
怎样将数据从寄存器送入内存单元?
• 结论:mov bx,1000H mov ds,bx mov [0],al (一种合理的回答)
3.2.2 字的传送
• 因为8086CPU是16位结构,有16根数 据线,所以,可以一次性传送16位的 数据,也就是一次性传送一个字。
8086CPU必须提供相应的指令
先回想我们如何修改AX中的值? mov指令不能用于设置CS、IP的值, 8086CPU没有提供这样的功能。 8086CPU为CS、IP提供了另外的指 令来改变它们的值:转移指令
修改CS、IP的指令
Jmp指令
• 跳转指令,同时修改CS、IP的内容。
格式:
• jmp 段地址:偏移地址
第三章指令系统与寻址方式
Questions? •1. 汇编指令是什么? •2. 机器如何也去寻指? •3. 指令中的操作数在哪儿存放? •4.机器又是如何去寻数? •5. 为什么要有寻址方式?
3.1 汇编语言指令
3.1.1 机器指令 机器指令也称作代码指令。它是计算机能识 例 1 用机器指令实现将7加3的结果存入5号字节单元的操 作。 别的一组二进制代码。
3.2 数据存取
例子:我们要读取10000H单元的内容 可以用如下程序段进行:
• mov bx,1000H • mov ds,bx • mov al,[0]
上面三条指令将10000H(1000:0)中 的数据读到al中。
指令 mov al,[0] 已知的mov指令可完成的两种传送功能:
• (1)将数据直接送入寄存器; • (2)将一个寄存器中的内容送入另一个寄存器中。
• 10000H表示为1000:0(段地址:偏移地址) • 将段地址1000H放入ds • 用mov al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元, []中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中)
如何把1000H送入ds?
如何把1000H送入ds? • 传送指令 mov ax,1 • 相似的方式 mov ds,1000H? • 8086CPU不支持将数据直接送入段寄存器 的操作,ds是一个段寄存器。 • (硬件设计的问题) • mov ds,1000H 是非法的。 • 数据一般的寄存器段寄存器
目的操作数 源操作数
例3 三操作数指令(三地址指令)
• IMUL EBX,[ESI],7 ;乘法指令。(80386机器指令)
例4 无操作数指令(零地址指令)
• CBW • CLC • NOP • HLT ;字节转换为字指令 ;进位标志CF清零 ;不操作指令 ;停机指令
2.指令属性
(1)指令长度——根据指令的功能不同,指令的 长度也不一样(以字节为单位)。分为单字节指 令、双字节、三字节、四字节和多字节指令等。
3.3.1 CPU提供的栈机制(续)
• 8086CPU提供入栈和出栈指令: (最 基本的) PUSH(入栈) POP (出栈) push ax:将寄存器ax中的数据送入栈 中; pop ax :从栈顶取出数据送入ax。 • 8086CPU的入栈和出栈操作都是以字 为单位进行的。
• 下面举例说明,我们可以将10000H~1000FH这段 内存当作栈来使用。 • 下面一段指令的执行过程:
1、指令格式
• 汇编指令由操作码字段和操作数字段构成。
操作码字段
操作数字段
例1 单操作数指令(一地址指令)
• INC AX ;加1指令。 • INC BL ;加1指令。 • PUSH AX ;进栈指令。 • JMP LA1 ;无条件转移指令。
例2 双操作数指令(两地址指令)
• MOV AX,5 ;传送指令。 • ADD AX,BX ;加法指令。
3.2.4 数据段(续)
• 问题 • 写几条指令,累加数据段中的前3个 字型数据。
相关主题