[计算机组成原理]计算机指令系统做题+原理

指令系统

指令格式

指令(机器指令)

是指计算机执行某条操作的命令,是计算机运行的最小功能单位。

一台计算机的所有指令的集合构成该机的指令系统,也称指令集。

不同计算机的指令系统不一定兼容

基本概念

指令:控制计算机执行某种操作的命令。

机器语言:计算机硬件实体直接表示控制信息的语言。

*机器语言程序:*用机器语言编制的程序。

机器语言是计算机硬件能直接理解并执行的语言,任何用其它语言编制的程序,都必须经过 “翻译”,翻译为机器语言程序,才能在机器中正确的运行。

一条指令就是机器语言的一个语句,用来说明机器硬件应完成的操作。

指令系统(指令集):一台计算机所能执行的全部指令的集合。

机器语言是面向机器的:不同的计算机系统,具有不同的指令,每一计算机系统都具有自己的指令系统。

指令系统必须是完备的:即任何运算都可以用指令系统中的指令编程实现。

*指令系统是计算机体系结构的核心;*是计算机系统硬件、软件的主要界面。它既是计算机硬件设计的主要依据,又是计算机软件设计的基石。所以一台计算机指令系统的优劣,直接影响着计算机系统的性能。

CPU可直接访问的存储结构
  1. 主存储器:访存时要给出存储器单元地址

  2. CPU寄存器:包括通用寄存器和专用寄存器。

  3. I/O接口寄存器:包括数据寄存器和状态寄存器。

  4. 堆栈。

指令基本格式

指令字:表示一条指令的一串二进制代码

*指令字长度:*一个指令字所包含的二进制信息的位数。

定长指令字:机器的指令系统中各种指令字的长度均为固定的。

可变长指令字:机器的指令系统中各种指令字的长度随指令的功能而异。

*定长指令字结构:*指令长度固定

结构简单,指令译码时间短,有利于硬件控制系统的设计,但定长指令字指令平均长度长、容易出现冗余码点、指令不易扩展。

变长指令字结构:指令长度不等的地址

结构灵活,能充分利用指令的每一位,指令的码点冗余少,平均指令长度短,易于扩展。但可变长指令的指令格式不规整,取指令时可能需要多次访存,导致不同指令的执行时间不一致,硬件控制系统复杂。

一条指令就是机器语言的一个语句,是一组有意义的二进制代码

一条指令包括操作码字段和地址码字段两部分:

在这里插入图片描述

样例:
在这里插入图片描述

指令含义:(A1)OP(A2)->A3,A4= 下一条将要执行指令的地址

地址码

四地址指令

设存储字长和指令字长均32位,操作码占8位。
在这里插入图片描述

  • Ai可直接表示26=64个不同的位置

  • 一条指令的执行(假设每个地址都是主存地址)

    取指令 访存一次(假设指令字长=存储字长)

    取两个操作数访存2次

    存回结果访存1次

    共访存4次

执行过程

在这里插入图片描述

使用程序计数器PC后 ,指令地址和数据地址分开

在这里插入图片描述
在这里插入图片描述

三地址指令

设存储字长和指令字长均32位,操作码占8位。

在这里插入图片描述

下条指令地址隐含给出 * 隐含地址减少指令长度

通常使用程序计数器PC来跟踪程序的执行,并指示要执行的指令地址

特点

三地址指令编程方便,结果不影响运算操作数,但指令长度仍比较长,所以一般在字长较长的大、中型机中使用,而微、小型机中很少使用三个地址均为存储器地址的三地址指令。

二地址指令

设存储字长和指令字长均32位,操作码占8位。

在这里插入图片描述

特点
  1. 源地址中的操作数与目的地址中的操作数进行操作码所规定的操作,结果存入目的地址中。

  2. 二地址指令的指令长度短,特别是R—R型指令,不需访问存储器取操作数,指令执行速度快,因此是最常用的一种指令格式。尤其在RISC结构机器中,所有运算型指令均为R—R型指令。

  3. 二地址指令执行后,参加运算的操作数被破坏,若不希望被破坏,程序员写程序时需提前保护。

形式
  1. S-S (存储器-存储器)指令:

    A1、A2均为存储器地址的二地址指令。

在这里插入图片描述

  1. 寄存器-寄存器(R-R型)指令:

    A1、A2均为存储器地址的二地址指令。

在这里插入图片描述

  1. 寄存器—存储器型(R—S型)指令:

    A1、A2中一个是寄存器地址,另一个是存储器地址的二地址指令。也称一个半地址指令。

在这里插入图片描述

一地址指令

设存储字长和指令字长均32位,操作码占8位。
在这里插入图片描述

情况
  1. 单操作数指令:如INC、DEC、NEG等,只需一个操作数,其功能为: OP(A)→A

  2. 双操作数指令:另一个操作数通常采用隐含寻址的方法,将操作数隐含在约定的累加器AC中,

    其指令功能为: (AC)OP(A)→AC

特点

一地址指令长度短,指令执行速度快(若A为存储器地址,只需一次访存取数),对于字长较短的微、小型机,是一种常用的指令格式。

零地址指令

设存储字长和指令字长均32位,操作码占8位。

在这里插入图片描述

情况

不需操作数的控制型指令,如HALT、WAIT、NOP等。

运算型零地址指令:操作数隐含在堆栈

操作码

操作码指出指令中该指令应该执行什么性质的操作和具有何种功能

操作码是识别、了解指令功能与区分操作数地址内容的组成和使用放法等的关键信息。例如:指出是算数加运算,还是减运算;是程序转移,还是返回操作。

操作码分类

定长操作码->2n条指令

所有指令的操作码长度一致,位置固定。是一种简单规整的编码方法。

特点
  1. 位数和位置固定,指令译码简单,有利于简化硬件设计。

  2. 在字长较长的大、中型机以及超小型机中定长编码的操作码被广泛采用,

例如:在IBM 360/370机中,所有指令的操作码均为8位,最多可指定256种操作。

扩展操作码(不定长操作码)->操作码长度可变

不同指令的操作码长度不完全相同,操作码的位数不固定,分散地放在指令字的不同位置上。

特点
  1. 可用较短的指令字长表示更多的操作类型,寻址较大的存储空间。

  2. 操作码的位数不固定,且位置分散,增加了指令译码与分析的难度,使硬件设计复杂化。

  3. 在早期的微、小型机中,由于指令字较短,均采用变长编码的指令操作码。如Intel 8086、PDP一11等机器。
    在这里插入图片描述

扩展操作码

流程:动态将地址码变为操作码,上一个状态留对应位数到下一位进行操作码扩展。

例子1:只留一位进行扩展。

在这里插入图片描述

注意要点:

  • 不允许短码是长码的前缀,即段操作码不能与长操作码的前面部分的代码相同
  • 各指令操作码一定不能重复

通常情况下对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

例子2:
在这里插入图片描述

设地址长度为n,上一层留出m种状态,下一层可扩展出mX2n种状态

操作类型

  1. 数据传送

    LOAD 作用:把存储器中的数据放到寄存器中。

    STORE 作用:把寄存器中的数据放到存储器中。

  2. 算数逻辑操作
    在这里插入图片描述

  3. 移位操作

    算数移位、逻辑移位、循环移位(带进位和不带进位)

  4. 转移操作

**加粗样式**

  1. 输入输出操作

    CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)

分类:

  • 运算类

  • 程序控制类:改变程序执行的顺序

  • 输入输出类:进行CPU和I/O设备之间的数据传送

各种寻址方式

指令寻址方式

内存中指令存放都是补码形式
在这里插入图片描述

  1. 顺序方式:

    PC+增量->PC

    由于指令通常顺序存放,所以当程序顺序执行时,可以采用PC增量的方式形成下条指令地址。即按照PC的内容依次取指。增量的多少取决于一条指令所占的存储单元数。

  2. 跳跃方式

    当程序发生转移时,修改PC的内容。

    当程序需要转移时,由转移类指令产生转移地址并送入PC中。

    转移地址的形成有各种方法。

数据存放

按字节编址:每个字节存储单元都有一个地址编号

按字节地址寻址:给出一个字节地址,可以取出长度为一个字节的数据

假设数据长度为4B,则需要给出4个字节地址

按字地址寻址:给出一个字地址,可以取出长度为一个字的数据

字地址:0-3为一个字,4-7为一个字…

每个字中最小的字节地址作为字地址

假设某数据长度为4B,则需要给出1个字地址

数据高位在左,数据低位在右

地址左低,右高

单字长指令:指令长度=机器字长

半字长指令、双字长指令
在这里插入图片描述

大端正常,小端不正常

边界对齐存储

起始地址是字长(按字节算)的整数倍

在这里插入图片描述

指令寻址

在这里插入图片描述

定位下一条欲执行指令的指令地址 始终由PC程序计数器给出

顺序寻址:(PC)+ 1—>PC

不加()指寄存器,加()指寄存器中内容

跳跃寻址:由转移指令给出

在这里插入图片描述

寻址方式设计要求:
  1. 指令内包含的地址尽可能短,以缩短指令长度。

  2. 能访问尽可能大的存储空间。

    即能提供尽可能长的地址信息。根据程序所具有的局部性特性,大多数程序在一段时间内都使用存储器的一个小区域,所以,可以用短地址访问该区域内的任一单元的。

  3. 希望地址能隐含在寄存器中。

    因为寄存器地址比较短,而寄存器长度一般与机器字长相同,在字长较长的机器中.寄存器内存放的地址可访问很大的存储空间,所以地址隐含在寄存器,可以减少指令长度。

  4. 能在不改变指令的情况下改变地址的实际值。

  5. 寻址方式尽可能简单、规范,以便简化硬件设计。

数据寻址1

定位本条指令操作数地址

主要目的:将得到的形式地址转换为有效地址,根据不同寻址特征

在这里插入图片描述

寻址方式种类和指令格式

在这里插入图片描述

假设 指令字长=机器字长=存储字长,操作数为3。在这里插入图片描述

立即寻址

形式地址A就是操作数本身,又称为立即数,一般采用补码形式 *#*表示立即寻址特征
在这里插入图片描述

执行过程

取指令 访存1次

执行指令 访存0次

不考虑存结果

共访存1次

特点
  1. 指令执行阶段不访问主存,指令执行时间最短
  2. A的位数限制了立即数的范围
    在这里插入图片描述
直接寻址

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

在这里插入图片描述

执行过程

取指令1次

执行指令访存1次

暂不考虑存结果

共访存2次

特点
  1. 简单指令执行阶段仅访问一次主存,不需要专门计算操作数的地址
  2. A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改
间接寻址

指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)

在这里插入图片描述

多次寻址判断是否找到有效地址方法:前加标识位0为有效地址,下一次取指则为操作数

执行过程

取指令访存1次

执行指令访存2次

暂不考虑存结果

共访存3次

特点
  1. 可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)

  2. 便于编制程序(用间接寻址可以方便地完成子程序返回) 完成断点的访存

  3. 指令在执行阶段需要多次访存(一次间址需要两次访存,多次寻址需根据存储字的最高位确定几次访存。)

  4. 降低了指令执行速度

寄存器寻址

在指令字中直接给出操作数所在的寄存器编号,即EA = Ri,其操作数在由Ri所指的寄存器内。寄存器存在于CPU中

在这里插入图片描述

执行过程

取指令 访存1次

执行指令 访存0次

暂不考虑存结果

共访存1次

特点
  1. 比立即寻址慢一点,需要到寄存器中寻址
  2. 指令执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算
  3. 寄存器价格昂贵,计算机中寄存器个数有限
寄存器间接寻址

寄存器Ri中给出的不是一个操作数,而是操作数所在的主存单元的地址,即EA=(Ri)
在这里插入图片描述

执行过程

取指令 访存1次

执行指令 访存1次

暂不考虑存结果

共访存2次

特点
  1. 与一般的间接存储相比速度快,但指令的执行阶段需要访问主存(操作数在主存中)
隐含寻址

不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址

在这里插入图片描述

特点
  1. 有利于缩短指令字长
  2. 需要增加存储操作数或隐含地址的硬件
总结

在这里插入图片描述

数据寻址2 偏移寻址

在这里插入图片描述

基址寻址

将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A

在这里插入图片描述

注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)

当采用通用寄存器作为基址存储器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统决定

特点
  1. 课扩大寻址范围,(基址寄存器的位数大于形式地址A的位数);
  2. 用户不必考虑自己的程序存于主存的哪一空间区域,有利于多道程序设计,以及编制浮动程序
    在这里插入图片描述
变指寻址

有效地址EA等于指令字中的形式地址A与变指寄存器IX的内容相加之和,即EA=(IX)+A,其中IX为变指寄存器(专用),也可用通用寄存器作为变指寄存器。

在这里插入图片描述

注:变址寄存器面向用户的,程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。

特点
  1. 扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理裹住中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,
  2. 适合形成数组中数据和编写循环程序
    在这里插入图片描述

变址和基值寻址配合使用:EA=A+(BR)+(IX)

先变址后间址:EA=(A+(IX))

先间址后变址:EA=(A)+(IX)

相对寻址

把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于当前指令地址的偏移量,可正可负,补码表示。

在这里插入图片描述

特点
  1. 操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动。
  2. 相对寻址广泛用于转移指令
举例

在这里插入图片描述

在这里插入图片描述

  1. 反向要会求偏移量
    在这里插入图片描述
总结

在这里插入图片描述

数据寻址3 堆栈寻址

操作数放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。

堆栈指针SP,SP的内容永远指向堆栈当前的栈顶。

堆栈是存储器(或专用寄存器组)中一块特定的按"后进先出(LIFO)"原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
在这里插入图片描述

使用寄存器实现:硬堆栈

使用主存实现:软堆栈

堆栈两种生产方式

*自底向上生成方式:*栈底占最高地址,栈顶为较低地址,压入数据时,按由高地址向低地址顺序进行,弹出数据(即取出数据)时,由低地址向高地址顺序进行。

*自顶向下生成方式:*与自底向上生成方式顺序相反。

CISC和RISC

指令系统基本要求

  1. 完备性

    任何运算都可以用指令编程实现。即要求指令系统的指令丰富、功能齐全、使用方便,应具有所有基本指令。

  2. 有效性
    用指令系统中的指令编写的程序能高效率运行,占用空间小、执行速度快。

  3. 规整性
    指令系统具有对称性、匀齐性,指令与数据格式的一致性。

    对称性:所有寄存器和存储单元均同等对待,所有指令可以使用所有寻址方式,减少特殊操作和例外情况。

    匀齐性:一种操作可支持各种数据类型。如算术指令可支持字节、字、双字、十进制数、浮点单精度数、浮点双精度数等。

    指令与数据格式的一致性:指令长度与数据长度有一定的关系,以便于存取和处理。

  4. 兼容性

    系列机的各机种之间有基本相同的指令集。至少作到向后兼容,即先推出的机器上的程序可以在后推出的机器上运行。

CISC(Complex Instruction Set Computer)

RISC(Reduce Instruction Set Computer)

CISC和RISC概述

在这里插入图片描述

CISC和RISC比较
在这里插入图片描述

附录c 编译程序实验 实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 语法分析 C2.1 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. C2.2 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析. C2.2.1待分析的简单语言的语法 实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 实验的输入输出 输入是语法分析提供的正确的单词输出地址指令形式四元式序列。 例如:对于语句 begin a:=2+3*4;x:=(a+b)/c end# 输出地址指令如下: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思想 1设置语义过程 (1) emit(char *result,char *arg1,char *op,char *ag2) 该函数功能是生成一个地址语句送到四元式表中。 四元式表的结构如下: struct {char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2)char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…. Char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } (2)主程序示意图如图c.10所示。 (2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 语义分析程序的C语言程序框架 int lrparser() { int schain=0; kk=0; if(syn=1) { 读下一个单词符号; schain=yucu; /调用语句分析函数进行分析/ if(syn=6) { 读下一个单词符号; if(syn=0 && (kk==0)) 输出(“success”); } else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;} else{输出’begin’错误;kk=1;} } return(schain); int yucu() { int schain=0; schain=statement();/调用语句分析函数进行分析/ while(syn=26) {读下一个单词符号; schain=statement(); /调用语句分析函数进行分析/ } return(schain); } int statement() { char tt[8],eplace[8]; int schain=0; {switch(syn) {case 10: strcpy(tt,token); scanner(); if(syn=18) {读下一个单词符号; strcpy(eplace,expression()); emit(tt,eplace,””,””); schain=0; } else {输出’缺少赋值号’的错误;kk=1; } return(schain); break; } } char *expression(void) {char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12);/分配空间/ ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt =(char )malloc(12); strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/ while(syn=13 or 14) { 操作符 tt= ‘+’或者‘—’; 读下一个单词符号; strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/ strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/ emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/ strcpy(eplace,tp); } return(eplace); } char *term(void)/仿照函数expression编写/ char *factor(void) {char *fplace; fplace=(char *)malloc(12); strcpy(fplace, “ ”); if(syn=10) {strcpy(fplace,,token);/将标识符token的值赋给fplace/ 读下一个单词符号; } else if(syn=11) {itoa(sum,fplace,10); 读下一个单词符号; } else if (syn=27) {读下一个单词符号; fplace=expression();/调用expression分析返回表达式的值/ if(syn=28) 读下一个单词符号; else{输出‘}’错误;kk=1; } } else{输出‘(’错误;kk=1; } return(fplace); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire-From

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值