精读 《计算机组成原理》之指令系统

摘要:

本文主要阐述了什么是指令?什么是指令系统?指令的组成以及指令的寻址方式。通过本文你可以对指令系统建立初步的认识。 本文的内容主要是对计算机组成原理课本以及王道计算机组成原理指导的知识点整理归纳。

指令系统:

指令(机器指令)是指计算机执行某种操作的命令。 一台计算机的所有指令的集合构成了该机器的指令系统,也称为指令集。 指令系统是指令集体系结构(ISA)中最核心的部分。 ISA完整定义了软件和硬件之间的接口。

指令的基本格式:

一条指令就是机器语言的一个语句。 是一组有意义的二进制代码。 指令通常包括操作码字段地址码字段。操作码指出了指令的功能,地址码指出了被操作的信息(指令或数据)的地址。

指令的长度是指一条指令所包含的二进制位数。指令的长度和机器字长(cpu一次能处理的二进制位数)没有固定关系。如果指令字长等于机器字长就称为单字长指令,指令的长度等于机器字长的一半就称为半字指令。

如果在一个指令系统中,所有的指令长度相同,就称为定长指令字结构, 定长指令字速度快,控制简单。如果各个指令的长度根据功能而改变,则称为变字长指令字结构。通常指令字长是字节的整数倍。(因为主存一般按字节编址)

指令的分类:

 根据指令中操作数地址码的数目不同可以分为:

一、 零地址指令。

        只给出操作码OP,没有显示地址。  这种指令有两种情况

     1)不需要操作数的指令,例如停机指令。

     2)零地址的运算类指令仅用在堆栈计算机中。参与运算的两个数,隐式的从栈顶和次栈顶弹出,进行运算,然后把结果放入栈顶。

二、 一地址指令

   这种指令也是有两种常见的形态,需要根据操作码的定义进行判断

        1)只有目的操作数的单操作数指令,按A地址读取操作数,进行OP操作后,将结果放回原地址

        2)隐含约定目的地址的双操作数指令,例如ACC(累加器)运算, (ACC)OP(A)->ACC结果放入累加寄存器中。

三、二地址指令

指令含义  (A1) OP (A2) -> A1,

需要给出目的操作数和源操作数的地址,然后把结果放入目的操作数中。

四、三地址指令

指令含义(A1) OP (A2) -> A3

五、四地址指令

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

按照指令操作类型可以分为

一、 数据传送

传送指令通常由寄存器之间的传输(MOV),内存到寄存器的传输(LOAD),寄存器到内存的传输(STORE)等。

二、算术和逻辑运算

这里指令有 加法(ADD),减(SUB),与(AND),或(OR)等

三、移位操作

主要有算术移位、逻辑移位、循环移位等。

四、转移操作

主要有无条件转移和条件转移,无条件转移顾名思义,在任何情况下都可以执行。条件转移通常要在特定的条件下才能运行。 调用指令和转移指令的区别: 调用指令执行的时候必须保存下一条指令的地址,(即调用完成后,程序返回主程序执行的地址。例如中断处理),跳转指令不返回执行。

五、输入输出系统。

这类指令完成CPU和外设之间的数据交换或者传输控制命令。

指令的寻址方式:

寻址方式分为指令寻址和数据寻址两大类。寻找下一条要执行的指令称为指令寻址。寻址本条指令的数据地址称为数据寻址。

指令寻址:

1. 顺序寻址,通过PC(程序计数器)加一(一个指令字长),自动获取下一条指令的地址。

2. 跳跃寻址,通过转移类指令实现。跳跃指的是下一条指令的地址是由PC自动给出,而是在本条指令中给出。跳转的结果是修改当前的PC值,所以下一条指令还是由PC给出。

数据寻址:

在指令执行的过程中,操作数的来源通常有三个,1.指令中的地址码部分直接给出操作数 (直接获取值) 2. 将操作数存放在CPU内的通用数据寄存器中(寄存器获取)3.将操作数放在内存中(主存获取),对于内存寻址来说,既可以给出操作数的实际访问地址(EA,有效地址)。也可以给出形式地址,在指令执行的时候,通过某种方式把形式地址转化成有效地址。

1. 隐含寻址 (例子 ACC累加)

不明显的指出操作数的地址,而是在指令中隐含操作数的地址。 优点:有利于缩短指令字长。缺点:需要增加存储操作数或隐含地址硬件。

2. 立即寻址(即地址码中给出的不是地址而是真实的数值)

优点:不需要访问主存,缺点:地址码的位数限制了数值的范围。

3. 直接寻址(地址码中给出的是真实的内存地址EA,不需要转化)

EA=A,  仅在执行的时候访问一次主存。

4. 间接寻址(即地址码中的地址不是真实的地址,而是形式地址)

地址码中给出的是有效地址所在的存储单元地址,也就是操作数地址的地址,即EA=(A),(’()‘可以看作是对A地址的解引用,获取到A地址中的值,该值是真实的地址,类似C语言的指针)。间接寻址可以是一次,也可以是多次。

优点:可以扩大寻址范围,缺点:需要多次访问主存。

5.寄存器寻址

给出的地址码是操作数所在的寄存器的编号,(每个寄存器的地址已经固定,只要通过编号就可以找到对应的寄存器地址),即EA=Ri。操作数在Ri寄存器中。

优点: 不需要访问主存,速度快。缺点:寄存器的个数有限,

6. 寄存器间接寻址

寄存器中存放的是主存地址,该地址才是真正的操作数地址,即EA=(Ri) 

优点: 比一般的间接寻址快。

重点:

7.相对寻址:

相对寻址就是把PC的内容加上指令中形式地址A,形成有效地址,即EA=(PC)+A,

A就是偏移量,可正可负。

优点: 操作数的地址不固定,随PC的变化而变化,总是与地址间差个固定值(即偏移量),便于程序的浮动,广泛用于转移指令。

8. 基址寻址(面向操作系统)

指将CPU中基址寄存器(BR)的内容加上指令中的形式地址A,形成有效地址,即EA=(BR)+A。 其中基址寄存器可以采用专用寄存器,或者通用寄存器。

基址寄存器是面向操作系统的,其内容由操作系统或管理程序缺点,主要用于解决程序逻辑空间与存储器物理空间的无关系。(例如C语言程序中设置int a变量的地址为0x100,该地址是逻辑地址,并不是实际内存上的0x100这个物理地址,操作系统会通过VMM(虚拟内存管理)将程序映射到新的物理地址上,用户不需要知道程序处于哪个空间地址,只需要知道该空间偏移100就可以获得a这个变量),因此有利于多道程序设计,可以用于编制浮动程序。

9. 变址寻址(面向用户)

有效地址EA=形式地址A+变址寄存器IX的内容之和。 即EA=A+(IX)。实际应用最主要的就是处理数组问题。例如c语言中声明一个数组变量  int a[] = {1,2,3},那么a就是数组的首地址,首地址一般是不可变的,如果要访问数组中的元素,通常是使用”数组名[下标]“ 访问,其实本质上就是在首地址上加上偏移量, 这里偏移量就是改变IX寄存器的值,A就是存放数组的首地址 。A是不变的,IX中的值是会变的。显然变址寻址和基址寻址的形式很像,但是他们本质上是不一样的,基址寻址是面向操作系统,变址寻址是面向用户。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值