胡老师第十周讲义
# 指令系统
4.1指令系统的发展和性能要求
4.1.1指令系统及其发展

基本上是由简单到复杂再精简的过程
arm指令系统使用在手机上面,功效更低,但是能耗更小
x86指令系统使用的pc机上面,功效比较高,但是能耗比较高
mips是濒临倒闭的指令系统
4.1.2指令系统性能的要求
完备性:
用指令系统编写各种程序时,指令系统直接提供的指令足够使用,而不必用软件来实现。
有效性:
利用该指令系统所编写的程序能够在计算机上高
效率运行,主要表现在程序占据存储空间小、执行速度快。
规整性:
规整性包括指令系统的对称性、匀齐性、指令格式和数据格式的一致性 。
兼容性:
系列机各机种之间具有相同的基本结构和共同的基本指令集,低档机上运行的软件可以在高档机上运行,即做到“向下兼容” 。
4.2指令格式
4.2.1指令格式
举一个例子:
使用的操作指令如下所示

所以我们可以得出一个结论:指令是由 操作码+地址码 构成的
指令格式指用机器字表示的指令的结构形式,由两部分
组成,即进行何种操作和从存储器的那个单元取数;前者称
为操作码,后者称为地址码。所以指令的一般格式为

4.2.2指令字长度
指令字长度:一个指令字中包含二进制代码的位数
机器字长度:计算机能直接处理二进制数据的位数,他决定了计算机运算精度
于是衍生出了以下概念
单字长指令:指令字长等于机器字长度的指令。
半字长指令:指令字长等于半个机器字长度的指令。
双字长指令:指令字长等于两个机器字长度的指令。
多字长指令:指令字长等于几个机器字长度的指令。
使用多字长指令,目的在于提供足够的地址位来解决访问
内存任何单元的寻址问题。其主要缺点是必须两次或多次访问
内存才能取出一整条指令,降低了的运算速度,又占用了更多
的存储空间。
4.2.3操作码
操作码是而二进制码,和指令之间是强制的一一对应关系,是指令的身份证
一般来说n位操作码就有2n 条指令

操作码的举例
按操作码是否固定:
- 定长操作码
- 变长操作码
4.2.4指令助记符
为了便于指令的书写和阅读,并且为了便于存储,所以采用二到三个字母缩写表示指令,我们称为指令助记符

4.2.5地址码
根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。
4.2.5.1三地址指令
举一个简单的例子,一个加法的操作需要三个地址指令,被操作数,操作数,操作结果三个数
这个过程

4.2.5.2二地址指令

指令莱尔位数
地址码可以是内存的地址,也可以是寄存器的地址。
于是通过操作数的物理位置,可以把指令分为三种类型
- SS类型:(存储器-存储器类型),操作数都放在内存里。(计算机内不允许)
- RR类型:(寄存器-寄存器类型),操作数都在寄存器里面,执行效率比较高,
- RS类型:(寄存器-存储器类型),
4.2.5.3一地址指令
单操作数指令,通常可以使用的有累加操作指令。,指令字的地址码啊字段所指明的数为操作数,操作结果又放回累加寄存器中

4.2.5.4零地址指令
停机指令,没有没有地址码。
4.3操作数类型
4.3.1一般的数据类型
以奔腾32位x86架构处理器为例:
4.3.2Pentium数据类型
处理器里面的数据结构有:

int,double,string,char
4.4指令和数据的寻址方式
4.4.1指令寻址
顺序寻址
在内存中一条接着一条执行指令
如何让CPU明白什么是顺序执行:使用程序计数器(指令指针寄存器IP)每执行一条指令其值加1,指向下一条欲执行的指令地址。
跳跃寻址
所谓跳跃,是指下条指令的地址不是由程序计
数器PC加1产生,而是将本条指令给出的目标地址装入PC作为
下条指令的地址。
当程序执行循环指令或是转移指令是,
4.4.2操作数寻址

形式地址是指令字中的地址,有效地址是操作数的内存地址,寻址过程就是通过寻址特征把操作数的形式拆吹吹,变换为有效地址的过程。
立即数寻址

直接内存寻址
在指令格式的形式地址A中直接指出C座数的有效地址EA。由于操作数地址直接给呕出而不需要变换。
间接内存寻址
可以扩大寻址范围,但是效率很低,基本上已经被淘汰了。
间接寻址的情况下,指令地址字段的形式地址A不是操作数的有效地址EA, A单元的内容才是操作数的有效地址EA。
按推荐使用的方式:寄存器寻址
当操作数不放在内存中,而是放在CPU的通用寄存器中时, 可采用寄存器寻址的方式,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。
寄存器的间接寻址方式
寄存器爱间接寻址方式与寄存器寻址的方式区别在于:指令中的操作数地址只是处的寄存器中的内容不是操作数,而是操作数的有效地址EA。

以上的四种寻址方式是十分基础的寻址方式。所有的指令系统都是支持的。
指令表达
add R0 R3
| 寻址方式 | 寻址标记位 | 简单举例 |
|---|---|---|
| 立即寻址 | # | mov R0 , #10H |
| 直接内存寻址 | 无 | mov R0 , 10H |
| 寄存器寻址 | Ri | mov R0 , R1 |
| 寄存器间接寻址 | @ | mov R0 , @R1 |
汇编指令:
mov R0 , #0 0->R0
mov R1, #100 100->R1
next add R0, R1 R0+R1->R0
sub R1, #1 R1 -1
JNZ next 循环回去
现在有十个数相加,把他们相加以后的地址放在3000H

可用使用9次加法,但是不够优雅,更加优雅的做法:
R0 部分累加和, R! : 计数值, R2 :地址值
mov R0 ,#0
mov R1 ,#9
mov R2 #2000H
偏移寻址
需要对地址进行运算,把寄存器的地址加上一个偏移量,这个偏移量一般就是指令中的形式地址。
4.4.3基址位寻址方式
基质寻址的方式可以扩大寻址范围。基址寄存器的寄存器位数可以设置为32位甚至是40位左右。形式地址:16位, 基址寄存器:40位,那么有效的寻址位数是40位。
在程序的执行
过程中BR内容不变,由操作系统指定,形式地址A可变。
4.4.4变址寻址器
变址寄存器和基址寄存器的计算有效地址的方法十分相像。

IX:在执行一条指令,IX会自动的加一,所以在处理例如,字符串,数组等连续内存块来存储数据的数据结构的时候,具有很好的效果。
变址寻址器和基址寻址器的区别是A和IX, BR是否可以由用户改变
4.4.5堆栈寻址方式
串联堆栈:
一些计算机的CPU中有一组专门的寄存器,有16个或者更
多,其中每一个寄存器能保存一个字的数据,由专用的寄存器
组构成堆栈的存储空间,我们称为串联堆栈
存储器堆栈
sp是一个CPU的一个专用的寄存器,在存储器空间里面寻要一个堆栈指示器SP,他是CPU中一个专用的寄存器。堆栈指示器SP 指定的存储器单元就是堆栈的栈顶。栈底永远在高地址
堆栈存储器的特点
-
栈寄存器的操作指令只有两个,一个是pop,一个是push。
-
堆栈入栈是先入再减那么出栈就是先加再出,二者是镜像对称的。
-
堆栈是由高地址到底地址延伸的空间,是反向生长段。所以先入的栈底地址,是高地址。
-
堆栈的栈顶一般使用堆栈指针SP表示。入栈和出栈的操作
-
如果指针从高往低移动的时候移到了较低的位置,那么可能会移到其他数据的数据区域。这就叫做缓存溢出。
-
堆栈的长度可以由程序员来确定
-
堆栈的数目可以由程序员来决定
-
堆栈的主要存储的是代码段的返回地址
-
可以使用存储寻址的任意指令来对堆栈中得到数据进行寻址。

一般来说,代码段和数据段都是正向生长段,因为代码在编译时候就能过确定大小。但是堆栈段不同,因为对战的数据代码空间大小不确定,只能是先分配一个比较大的地址,然后在往小了分配地址。
变长操作码的指令

4.4.6指令格式
二地址指令的结构

指令格式的举例

- 这个指令有多长(单字长还是双字长)
- 这个指令是几地址码
- 这个指令是RR指令还是RS型指令
如何判断一个指令是否正确
-
先取出来一个指令,
-
翻译成二进制
-
根据格式取前若干位,对照操作指令

最后尊称而错误的原因:
4.5典型指令
典型的指令方式

4.5.1复杂指令计算机
经典代表:X86奔腾计算机
复杂指令系统的代表是X86,广泛的应用于微型
计算机,其特点是性能好,但是能耗和成本高。
例如奔腾机有191条指令,9种寻址方式。
但是通过对复杂指令系统计算机(CISC)的测试表
明,最常使用的一些最简单最基本的指令,只占指令
总数的20%,并且这些指令在程序中出现的频率达到
80%以上。
4.5.2经典指令系统
典型代表:ARM手机架构
- 选取使用频率最高的一些简单指令,减少指令系统
的指令条数。- 指令长度固定,指令格式种类少,寻址方式少。
- 只有取数/存数指令访问存储器。其余的指令的操
作都在寄存器间进行。- CPU内部的通用寄存器个数多。
4.5.3MIPS指令格式
MIPS架构由斯坦福大学开发,是一种有高度扩展性的
流水RISC处理器。 2002年,中国科学院计算所开始研发龙
芯处理器,采用MIPS架构
MIPS R4000处理器:指令字长32位,通用寄存器32个

Function的作用:操作码有些不够用,OP来确定一大类的指令,Function来确定其他的指令。
MIPS指令举例

MIPS里面的偏移寻址:LW $s1,100($s2)
-
100加一个括号相当于是在画面的范围里面加了一个偏移量
-
$s1 在RS里面就是 18

浙公网安备 33010602011771号