1.指令格式
1.1指令的定义
是指示计算机执行某种操作的命令, 是计算机运行的最小功能单位。 一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系 统中的指令,不能执行其他系统的指令。
1.2指令格式
一条指令通常要包括操作码字段和地址码字段两部分:
停机指令不需要地址码
一条指令可能包含 0个、1个、2个、3个、4个 地址码…
根据地址码数目不同,可以将指令分为 零地址指令、一地址指令、二地址指令…
1.3按地址码分类
零地址指令
- 不需要操作数,如空操作、停机、关中断等指令
- 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
一地址指令
- 1.只需要单操作数,如加1、减1、取反、求补等
- 指令含义:OP(A1)→A1 ,完成一条指令需要3次访存:取指->读A1->写A1
- 2.需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC) 注:A1 指某个主存地址, (A1)表示 A1所指向的地址中的内容
注:A1 指某个主存地址(类比C语言的指针)
(A1)表示 A1所指向的地址中的内容 (类比C语言的指针所指的位置)
三地址指令
四地址指令
地址码的位数有什么影响?
- n位地址码的直接寻址范围=2n
- 因为地址码长度越短,寻址范围越小,寻址能力越差
1.4按地址码分类(总结)
1.5指令-按指令长度分类
- 指令字长:一条指令的总长度(可能会变)
- 机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
- 存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存
- 定长指令字结构:指令系统中所有指令的长度都相等
- 变长指令字结构:指令系统中各种指令的长度不等
1.6指令-按操作码长度分类
- 定长操作码:指令系统中所有指令的操作码长度都相同
- 可变长操作码:指令系统中各指令的操作码长度可变
n位->2的n次条指令
控制器的译码电路设计简单, 但灵活性较低 控制器的译码电路设计复杂, 但灵活性较高
定长指令字结构+可变长操作码 à扩展操作码指令格式
2.扩展操作码指令格式
定长指令字结构+可变长操作码 à扩展操作码指令格式
2.1扩展操作码
设计规则:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
- 各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
2.2操作码的举例
- 三地址指令,前思维不为1
- 二地址指令前4位全为1
- 一地址指令前6位全为1
- 零地址指令前11位全为1,因为没有地址码,故表示32种状态
设地址长度为n,上一层留出m种状态,下一层可扩展出m×2的n次种状态
如三地址指令,有16种状态,因为不能是1111,故有16-15=1种留出
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。 操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术加运算,还是减运算;是程序转移,还是返回操作。
定长操作码: 在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 一般n位操作码字段的指令系统最大能够表示2n 条指令。
- 优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利;
- 缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。
扩展操作码(不定长操作码) :全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。
- 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的 指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
- 优: 在指令字长有限的前提下仍保持比较丰富的指令种类;
- 缺:增加了指令译码和分析的难度,使控制器的设计复杂化。
3.指令寻码
寻址下一条欲执行的指令地址称为指令寻址。
而指令寻址的而下一条欲执行的指令始终存放在程序计数器PC中。
3.1顺序寻址
(PC)+“1”=PC
这里的1为相隔一个指令的具体地址增量,与指令长度和编址方式有关。(PC)表示是PC内容加“1”后的内容放入PC。
该系统采用定长指令字结构:故每一条指令占用2个地址
对于变长
操作步骤:
- 读入一个字,根据操作码判 断这条指令的总字节数 n, 修改PC的值
- ( PC ) + n->PC
- 根据指令的类型,CPU可能还要进行多次访存,每次读入一个字(由于不知道一种类型站多少指令)
3.2跳跃寻址
JMP:无条件跳转指令,将当前PC中的值4修改为7.
通过这种指令让CPU跳跃着,找到下一跳的指令位置
3.3数据寻址
如果从100开始就不对了
应该改成
3的正确解读:CPU执行到103,PC指向104,在PC指向的基础上指向下三位,故则表示107这个位置。
数据寻址是指如何在指令中表示一个操作数的地址 。
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址。
3.3.1隐含寻址
3.3.2立即寻址
3.3.3直接寻址
3.3.4间接寻址
3.3.5寄存器寻址
3.3.6寄存器间接寻址
相对寻址、基址寻址、变址寻址都属于偏移寻址。
3.3.7相对寻址
3.3.8基址寻址
只用修改BR的数据就可以了
3.3.9变址寻址
注意:IX作为偏移量,A为基地址(保持不变)
变址寄存器的内容可以由用户改变
在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
实际应用过程中通常是基址寻址和变址寻址相结合。如通过基址寻址将数组的起始地址放到100这个实际地址,通过变址寻址将数组元素的地址进行迭代。
如何比较
硬件视角:
• 通过”cmp指令”比较a和b(如cmp a,b),实质上是用 a-b
• 相减的结果信息会记录在程序状态字寄存器中(PSW)
• 根据PSW的某几个标志位进行条件判断,来决定是否转移
3.3.10堆栈寻址
步骤:
- 在寄存器栈顶的元素指向ACC
- 再使栈顶的方向指向下一位
- 使此时的栈顶元素放入X种
- 再使栈顶的方向指向下一位
- ADD(相加ACC和X),将结果放在寄存器Y上面
- push将SP指针减一放入R1,再将Y的值放入
堆栈可分为硬堆栈和软堆栈两种。寄存器堆栈又称硬堆栈;而从主存中划出一段区域用来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。
知识补充:
二轮补充(一轮时没有理解的这么到位)
寻址方式中的指令寻址和数据寻址是并存的,
对于一些运算类指令,它的指令寻址方式是顺序寻址(默认),数据寻址方式就是那些各种各样的方式。
但对于转移类指令来说,它的指令寻址方式就是跳跃寻址,它的所谓数据寻址其实是如何来表示这个跳跃的量,和介绍的数据寻址方式差不多,格式不重要,思想类似,转移类指令的目标就是正确转移。
4. CISC和RISC的基本概念
一些零碎的知识点:
5.总结
指令系统采用不同寻址方式的优缺点:
- 优点:可缩短指令字长,扩大寻址空间,提高编程的灵活性。
- 缺点:提高了指令译码的复杂度。
②关于指令中某个地址段的位数 :
- 隐含寻址:当为单地址指令时通常是两个操作数,只有一个被隐含了。故其形式地址位数还是主存地址位数。
- 立即寻址:与立即数的位数有关。如果地址段位数太少则立即数的表示范围会很小。所以一般地址段长度最长
- 直接、间接寻址:形式地址是主存地址。
- 寄存器、寄存器间接寻址:形式地址是寄存器的编号,而寄存器很少。
- 变址、基址、相对寻址:形式地址与主存寻址空间有关。
- 综上,为了缩短指令中某个地址段的位数,有效的方法是寄存器(间接)寻址。
③ 简化地址结构的基本方法是尽量采用隐地址。
- 解释:当有两个操作数时简化为只用指示一个操作数;当为一个操作数时为零地址指令。
④在数据寻址的各种方式中,获取操作数最快的方式是立即寻址。
定长指令集立即寻址执行速度最快;但如果是变长指令集,执行速度最快的是寄存器寻址方式,立即寻址指令码最长,取指令访存花费时间较多。
⑤在数据寻址的各种方式中,寻址方式可以结合使用,如变址间接寻址:
- 变址寄存器为X,指令中的地址码为A,则EA=((X)+A )。
⑥在多道程序设计中,最重要的寻址方式是相对寻址。
- 多道程序设计技术是指在内存同时放若干道程序,使它们在系统中并发执行,共享系统中的各种资源。当一道程序暂停执行时,CPU立即转去执行另一道程序。
- 在程序 (特别是用ASM写的程序)中制定的一些数据的位置是不确定的,比如你原来想读一个1500位置上的数据,但是实际上这个1500到底存了什么是不确定的,所以,采用了相对地址的策略,即所有的数据都是假设程序开始 (ORG)位置为0的相对地址.... 所谓程序浮动,就是针对这样一种情况,在运行过程中采取相对地址的技术来实现的.
二轮注:不重要不清楚不了解,背熟三字口诀。
⑦转移指令、子程序调用与返回指令用于解决变动程序中指令执行次序的需求,而不是数据调用次序的需求。
⑧指令格式规整且长度一致、指令和数据按边界对齐存放、只有Load/Store指令才能对操作数进行存储访问。
⑨基址、变址寄存器内容、内存地址都是真值,而形式地址一般用补码表示,我们计算有效地址时EA=(X)+A时需要把形式地址A转换为真值。(整数负数补码拓展位补一)。