计算机组成原理——指令系统

一 指令系统

什么是指令(机器指令)?

指令是指示计算机执行某种操作的命令,例如add进行加操作,以及其他加减乘除和逻辑运算等。一台计算机的所有指令的集合构成该计算机的的指令系统(指令集)。

1 指令的基本格式

指令就是一组二进制代码,指令 = 操作码字段 + 地址码字段

操作码:识别指令,了解指令功能,区分操作数地址内容的组成和使用方法

地址码:给出被操作数的信息的地址

指令的长度与机器字长没有关系,可以等于也可以不等,例如单字长,半字长,双字长指令(都是字节的整数倍)

一个指令系统中,所有指令长度一样为定长指令字结构;指令长度随功能而异称为变长指令字结构

取指令是一次访存,按地址取数也是一次访存,放回运算结果也是一次访存

1.1 零地址指令

在这里插入图片描述

只给出操作码OP,没有显式地址

(1)不需要操作数,如空操作,停机操作,关中断指令等

(2)仅用在堆栈计算机中。另个操作数隐含的从栈顶和次栈顶弹出,送到运算器运算再隐含的压回栈顶

1.2 一地址指令

在这里插入图片描述

(1)只有目的操作数的单操作数指令,按A1地址取数完成操作后存回原地址,OP(A1)—>A1,比如加1,减1;三次访存

(2)隐含约定目的地址的双操作数指令,按A1取数,另一个隐含在ACC累加器中,运算结果也放在ACC中,(ACC)OP(A1)—>ACC;2次访存

1.3 二地址指令

在这里插入图片描述

(A1)OP(A2)—>A1,分别给出目的操作数地址和源操作数地址,目的地址还保留本次运算结果;四次访存

1.4 三地址指令

在这里插入图片描述

(A1)OP(A2)—>A3;四次访存

1.5 四地址指令

在这里插入图片描述

(A1)OP(A2)—>A3,A4是下一条要执行的指令的地址,即执行指令后,PC修改为A4所指地址;四次访存

2 定长操作码指令格式

指令字的最高位取n位固定的长度表示指令,有2n种指令,简化硬件设计,指令译码和识别速度快

3 扩展操作码指令格式

在定长指令长度的前提下采用可变长度操作码丰富指令种类,但增加了译码难度,控制器设计更复杂

常见方法是扩展操作码,但是扩展的方法会有所变动,例如取不同的一地址,二地址,三地址的指令条数

(1)短码不能是长码的前缀,比如

1111 0000

1111 1000

此时重叠,导致冲突

(2)各指令的操作码一定不能重复

一般情况常把使用频率高的指令分配较短的操作码,减少指令译码和分析时间

4 指令的操作类型

(1)数据传送

寄存器之间或者CPU,内存等

(2)算术和逻辑运算

ADD,SUB,CMP,MUL,DIV,INC,DEC,AND,OR,NOT,XOR等

(3)移位操作

(4)转移操作

无条件转移,条件转移,调用,返回,陷阱等

(2)输入输出操作

二 指令的寻址方式

是指寻找指令或操作数有效地址的方式,常分为指令寻址和数据寻址两大类

指令的地址码不是真实地址的称为形式地址(A),操作数的真实地址称为有效地址(EA)

1 指令寻址和数据寻址

1.1 指令寻址

寻找下一条将要执行的指令地址

(1)顺序寻址

程序计数器PC自动加1(一个指令字长),自动形成下一条指令的地址

(2)跳跃寻址

通过转移类指令实现,例如四地址中的A4,但是是否跳跃瘦状态寄存器和操作数的控制

绝对地址:标记符直接得到

相对地址:当前指令地址的偏移量

跳跃的结果是修改PC的值

1.2 数据寻址

是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数

在这里插入图片描述

2 常见的数据寻址方式

2.1 隐含寻址

不明显给出操作数的地址,例如零地址或者一地址的指令格式,隐含操作数在ACC或者堆栈中

缩短了指令字长,但是需要增加操作数或隐含地址的硬件

2.2 立即(数)寻址

地址段指出的不是操作数的地址,而是操作数本身(立即数),补码表示

不用访存,指令执行时间短,但是位数限制了立即数的范围

2.3 直接寻址

指令中的形式地址A就是操作数的真实地址EA,EA=A

寻址简单,一次访存,但A的位数决定了寻址范围,不易修改

2.4 间接寻址

指令的地址段给出的形式地址不是真实的地址,而是真实地址所在的存储单元的地址,EA=(A),可以是一次间接,也可以是多次

在这里插入图片描述

如图所示,主存第一位是1,表示不是真实地址,还需要查找,直到第一位是0

可寻址范围大,便于编程;但需要多次访存,速度慢

2.5 寄存器寻址

指令中直接给出寄存器编号,EA=Ri,操作数在寄存器中

不访存,执行速度快,支持向量矩阵运算;但是贵,数量有限

2.6 寄存器间接寻址

RI中不是操作数,而是真实地址的地址,EA=(Ri

比一般间接寻址更快,需要访存

2.7 相对寻址

把PC中的内容加上指令格式中形式地址A形成真实地址,EA=(PC)+A,A就相当于PC的偏移量,可正可负,补码表示

A的位数决定寻址范围

操作数地址不固定,随PC值改变,便于程序浮动(一段代码在程序中浮动);常用于转移指令

取出转移指令后PC的值会自增,比如指令字长2B,以字节编址,那么PC+2,真实地址就是PC+2+A

在这里插入图片描述

2.8 基址寻址

将CPU中基址寄存器BR(面向操作系统)的内容加上形式地址A形成真实地址,EA=(BR)+A,BR可以是专用的也可以是通用寄存器

程序执行时,BR的内容不变,A会变动

寻址范围大,用户不用考虑程序在内存的位置,有利于多道程序设计,编址浮动程序(在内存中浮动),但A的位数较短

在这里插入图片描述

2.9 变址寻址

形式地址A加上变址寄存器IX(面向用户)的内容为真实地址,EA=(IX)+A,IX可以是专用的也可以是通用寄存器

A不变,IX的内容(偏移量)可以用户进行改变

寻址范围大,且适合编制循环程序(例如循环访问数组),for(i=0,;i<n;i++)中的i就相当于IX

2.10 堆栈寻址

堆栈是存储器(或寄存器组)中一块特定的后进先出的存储区

这个区域的读写单元的地址是特定的寄存器给出,称为堆栈指针SP

(1)硬堆栈(寄存器),成本高

(2)软堆栈,从内存中取一部分

常是无操作数指令的形式,读写后SP自动完成增减

在这里插入图片描述

复合寻址 ,EA = (IX )+((BR)+A)

三 程序的机器级代码表示

基于X86处理器

1 常用汇编指令介绍

使用不同编程工具开发程序,用到的汇编程序也不用,汇编格式也不同,一般有AT&T,Intel格式

在这里插入图片描述

在这里插入图片描述

AT&T Intel
只能小写 不敏感
源—>目的 目的<—源
寄存器前加%,立即数前加$
寻址符号() 寻址符号【】
复杂寻址“disp(base,index,scale)”,表示偏移量,基址,变址和比例因子,base+index*scale+disp 直接就是base+index*scale+disp
b字节,w字,l双字 byte ptr,word ptr,dword ptr

汇编指令常分为数据产生,逻辑计算,控制流

常用指令

(1)mov

第二个操作数复制到第一个;不能从内存到内存

(2)push

将操作数压入内存的栈

ESP是栈顶,压入前ESP减4(栈增长方向和内存地址方向相反),然后把数压入ESP所指地址

(3)pop

出栈,先把内容出栈,然后增加4

(4)add/sub

add相加,把结果保存到第一个数;sub相减,把结果保存到第一个数

(5)inc/dec

把操作数自增1,自减1

(6)imul

带符号整数乘法指令;两个操作数放入第一个操作数时必须是寄存器;三个操作数放入第一个操作数时必须是寄存器

(7)idiv

带符号整数除法指令,只有一个操作数,即除数,被除数在寄存器edx:eax(64位)中,商送到eax,余数送到edx

(8)and/or/xor

逻辑与,逻辑或,逻辑异或

(9)not 位翻转

(10)neg 取负指令

(11)shl/shr

逻辑左移,逻辑右移,第一个操作数表示被操作数,第二个表示移位的位数

(12)jmp

控制ip到label所指示的地址

(13)jcondition

条件转移指令,根据CPU状态字中的条件状态转移

(14)cmp/test

比较/逐位与运算,都不保存结果,根据结果设置CPU状态字的条件码

(15)call/ret

子程序的调用和返回。

call保存当前指令地址,然后转移,ret返回,然后弹出保存的指令地址无条件转移

2 过程调用的机器级表示

就是函数调用时各类数据的流动和栈的调用与返回

3 选择语句的机器级表示

常见的有if-then,if-then-else,case(swith)等

通过条件码设置指令各类转移指令来实现

(1)条件码/标志码

CF进位,ZF零标志,SF符号,OF溢出

(2)if语句

在这里插入图片描述

4 循环语句的机器级表示

(1)do-while

(2)while

(3)for

在这里插入图片描述

四 CISC和RISC的基本概念

指令系统发展方向:

(1)增强原有指令功能,形成更复杂的复杂指令系统计算机(CISC)

(2)减少指令种类和简化功能,提高速度,精简类指令系统计算机(RISC)

1 CISC

复杂庞大,指令数目200以上

指令长度不固定,格式多,寻址方式多

可以访存的指令不受限制

不同指令使用频度相差大,有的使用很多,有的使用很少,且执行时间相差大

控制器采用微程序控制,难以用优化编译生成高效程序

不够合理

2 RISC

要求指令系统简化,尽量使用寄存器-寄存器操作指令

用简单指令来实现复杂指令

指令长度固定,格式种类少,寻址方式少

只有load/store指令访存,其余指令的操作都在寄存器之间进行

通用寄存器很多,一定采用流水线技术,大部分指令在一个时钟周期完成

重视编译优化,减少程序执行时间

RISC更能利用VLSI芯片的面积,更能提高运算速度,便于设计,减低成本,提高可靠性,有利于编译程序代码优化

但早期多是CISC,所有CISC的兼容性更好

猜你喜欢

转载自blog.csdn.net/m0_70403090/article/details/130997670