Posted Scean周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了)相关的知识,希望对你有一定的参考价值。

第三章 指令系统

1.1 指令格式

1.1.1 机器指令的基本格式

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下:

操作码:指明了指令的操作性质及功能。
地址码:则给出了操作数的地址。
①、指令的长度是指一条指令中所包含的二进制代码的位数,它取决于操作码字段的长度操作数地址的个数及长度
②、指令的长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长
③、指令长度等于机器字长的指令称为单字长指令;指令长度等于半个机器字长的指令称为半字长指令;指令长度等于两个机器字长的指令称为双字长指令
④、所有指令的长度都是相等的,就称该指令系统为定长指令字结构。若各种指令的长度随指令功能而异,就称该指令系统为变长指令字结构

1.1.2 地址码结构

计算机执行一条指令所需要的全部信息都必须包含在指令中。对于一般的双操作数运算类指令来说,除去操作码(OP)之外,指令还应包含以下信息:
①、第一操作数地址,用A1表示
②、第二操作数地址,用A2表示
③、操作结果存放地址,用A3表示
④、下一条将要执行指令的地址,用A4表示
这些信息可以在指令中明显地给出,称为显地址;也可以依照某种事先的约定,用隐含的方式给出,称为隐地址

1、四地址指令

OP表示具体的操作,Ai表示地址,(Ai)表示存放于该地址中的内容

2、三地址指令

注:PC为程序计数器来存放指令地址。通常每执行一条指令,PC就自动加1,直接得到就要执行的下一条指令的地址。这样,指令中就不必再明显地给出下一条指令的地址了。

执行一条三地址的双操作数运算指令,至少需要访问4次主存。第一次取指令本身,第二次取第一操作数,第三次取第二操作数,第四次保存运算结果。

3、二地址指令

A1为目的操作数地址,A2为源操作数地址。
注:指令执行之后,目的操作数地址中原存的内容已被破坏了。执行一条二地址的双操作数运算指令,同样至少需要访问4次主存。

4、一地址指令

注:Acc表示为累加寄存器,在执行一条一地址的双操作数运算指令,只需要访问两次主存。第一次取指令本身,第二次取第二操作数。

5、零地址指令

1.不需要操作数,如空操作、停机、关中断等指令
2.堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶

1.1.3 指令的操作码

指令操作码的编码可以分为规整形非规整型两类编码

1、规整型编码(定长编码)
①、定长编码的操作码字段的位数和位置是固定
②、

③、定长编码对于简化硬件设计减少指令译码的时间是非常有利的

2、非规整型编码(变长编码)

①、变长编码的操作码字段的位数是不固定的,且分散地放在指令字的不同位置上。
②、变长编码能够有效地压缩指令中操作码字段的平均长度
③、操作码字段的位数和位置不固定将增加指令译码和分析的难度,使得控制器的设计复杂化。

3、扩展操作码法
让操作数地址个数多的指令的操作码字段短些,操作数地址个数少的指令的操作码字段长些

例如:设某机的指令长度为16位,操作码字段为4位,有三个4位的地址码字段

如果按照定长编码的方法,4位操作码字段最多只能表示16条不同的三地址指令

1.2 寻址技术

所谓寻址,指的是寻找操作数的地址或下一条将要执行的指令地址。寻址技术包括编址方式寻址方式

1.2.1 编址方式

1、编址
要对寄存器、主存器和输入输出设备等进行访问,首先必须对它们进行编址。

2、编址单位
编制单位有字编址字节编址位编址

⑴ 字编址
编址单位=访问单位
每个编址单位所包含的信息量(二进制位数)与读或写一次寄存器、主存所获得的信息量是相同的。早期的大多数机器都采用这种编址方式。

(2) 字节编址
字节编址为了适应非数值计算的需要。字节编址方式使编址单位与信息的基本单位(一个字节)相一致,这是它的最大优点。
编址单位<访问单位

⑶ 位编址
有部分计算机系统采用位编址方式

3、指令中地址码的位数
指令格式中每个地址码的位数是与主存容量最小寻址单位 (即编址单位) 有关联的。
主存容量越大==,所需的地址码位数就越长。对于相同容量来说,如果以字节为最小寻址单位,地址码的位数就需要长些;如果以为最小寻址单位(假定字长为16位或更长),地址码的位数可以减少。

1.2.2 指令寻址和数据寻址

①、寻址可以分为:寻找下一条将要执行的指令地址称为指令寻址和寻找操作数的地址称为数据寻址
②、指令寻址比较简单,它又可以细分为:顺序寻址跳跃寻址
③、顺序寻址可通过程序计数器PC加1,自动形成下一条指令的地址;跳跃寻址则需要通过程序转移类指令实现。跳跃寻址的转移地址形成方式有3种:直接(绝对)相对间接寻址
④、跳跃寻址与数据寻址的不同的是:前者寻找转移的有效地址,后者是寻找操作数的有效地址、

1.2.3 基本的数据寻址方式

1.立即寻址
EA=(PC)
S=A

2.寄存器寻址
(1)操作数S与寄存器Ri的关系为:S=(Ri)
(2)寄存器寻址具有两个明显的优点:①从寄存器中存取数据比从主存中快得多;②由于寄存器的数量较少,其地址码字段比主存单元地址字段短得多

3.直接寻址(绝对寻址方式)
(1)指令中地址码字段给出的地址A就是操作数的有效地址,即形式地址等于有效地址:EA=A。
(2)操作数S=(A)

4.间接寻址
(1)间接寻址意味着指令中给出的地址A不是操作数的地址;而是存放操作数地址的主存单元的地址,简称操作数地址的地
址。

(2)通常在指令格式中划出一位作为直接或间接寻址的标志位,间接寻址时标志位@=1。在一级间接寻址中,EA=(A) S=((A))

5.寄存器间接寻址
指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在主存单元中。S=((Ri))

6.变址寻址
把变址寄存器Rx的内容与指令中给出的形式地址A相加,形成操作数有效地址,即EA=(Rx)+A。Rx的内容称为变址值。S=((Rx)+A)

7.基址寻址
基址寄存器Rb的内容与指令中给出的位移量D相加,形成操作数有效地址,即EA=(Rb)+D。基址寄存器的内容称为基址值。指令的地址码字段是一个位移量,位移量可正、可负。S=((Rb)+D)

8.相对寻址
相对寻址是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为位移量D,两者相加后得到操作数的有效地址,即EA=(PC)+D S=((PC)+D)

9.页面寻址
(1)页面寻址相当于将整个主存空间分成若干个大小相同的区,每个区称为一页,每页有若干个主存单元。每页都有自己的编号,称为页面地址;页面内的每个主存单元也有自己的编号,称为页内地址
(2)操作数的有效地址就被分为两部分:前部为页面地址,后部为页内地址。

(3)页面寻址又可以分成三种不同的方式:
①、基页寻址,EA=0//A,操作数S在零页面中。基页寻址实际上就是直接寻址。
②、当前页寻址,EA=(PC)H//A,操作数S与指令本身处于同一页面中。
③、页寄存器寻址,页面地址取自页寄存器,与形式地址相拼接形成有效地址。

10.区分不同的寻址方式
(1)为了能区分出各种不同寻址方式,必须在指令中给出标识。标识的方式通常有两种:显式和隐式。
(2)显式的方法就是在指令中设置专门的寻址方式字段,用二进制代码来表明寻址方式类型。
(3)隐式的方式是由指令的操作码字段说明指令格式并隐含约定寻址方式。

1.2.4 变型或组合寻址方式

1.自增型寄存器间址和自减型寄存器间址

(1)自增寻址
寄存器Ri的内容是有效地址,按照这个有效地址从主存中取数以后,寄存器的内容自动增量修改。在字节编址的计算机中,若指向下一个字节,寄存器的内容+1;若指向下一个字(设字长16位),寄存器的内容+2。
自增寻址操作的含义为:
EA=(Ri)
Ri←(Ri)+d
其中:EA为有效地址,d为修改量,通常记作(Ri)+,加号在括号之后,形象地表示先操作后修改。

(2)自减寻址
自减寻址是先对寄存器Ri的内容自动减量修改(-1或-2),修改之后的内容才是操作数的有效地址,据此可到主存中取出操作数。
自减寻址操作的含义为:
Ri←(Ri)-d
EA=(Ri)
通常记作-(Ri),减号在括号之前,形象地表示先修改后操作

2.扩展变址方式

把变址和间址两种寻址方式结合起来,就成为扩展变址方式,按寻址方式操作的先后顺序,有前变址后变址两种形式。
⑴、先变址后间址(前变址方式)
先进行变址运算,其运算结果作为间接地址,间接地址指出的单元的内容才是有效地址。所以,有效地址EA=(A+(Rx)),操作数S=((A+(Rx)))
⑵、先间址后变址(后变址方式)
将指令中的地址码先进行一次间接寻址,然后再与变址值进行运算,从而得到一个有效地址。所以,有效地址EA=(A)+(Rx),操作数S=((A)+(Rx))

3.基址变址寻址

基址变址寻址是最灵活的一种寻址方式,此时有效地址是由基址寄存器中的值、变址寄存器中的值和位移量三者相加求得的。
EA=(Rb)+(Rx)+D
其中:Rb为基址寄存器,Rx为变址寄存器,D为位移量。

1.3 堆栈有与堆栈操作

堆栈是一种按特定顺序进行存取的存储区,这种特定顺序可归结为:后进先出(LIFO)或先进先出(FILO)

1.3.1 堆栈结构

1、寄存器堆栈

用一组专门的寄存器构成寄存器堆栈,又称为硬堆栈,这种堆栈的栈顶是固定的

2、存储器堆栈

从主存中划出一段区域来作堆栈,这种堆栈又称为软堆栈堆栈的大小可变,栈底固定,栈顶浮动,故需要一个专门的硬件寄存器作为堆栈栈顶指针SP,简称栈指针。栈指针所指定的主存单元,就是堆栈的栈顶。

3、 自底向上生成堆栈的进栈

堆栈的栈底地址大于栈顶地址,通常栈指针始终指向栈顶的满单元。进栈时,SP的内容需要先自动减1,如何再将数据压入堆栈。
(SP)-1→SP 修改栈指针,(A)→(SP) 将A中的数据压入堆栈

4、自底向上生成堆栈的出栈

出栈时,需要先将堆栈中的数据弹出,然后SP的内容再自动加1。
((SP))→A 将栈顶内容弹出,送入A中 (SP)+1→SP 修改栈指针

1.3.2 堆栈操作

①、堆栈是保存操作数和运算结果的唯一场所
②、例如:有算术表达式a×b+c÷d,运算结果送x,这个算术表达式可以用逆波兰法表示成为ab×cd÷+。

1.4 指令类型

1.4.1 数据传送类指令

1、一般传送指令

一般传送指令具有数据复制的性质,即数据从源地址传送到目的地址,而源地址中的内容保持不变。一般传送类指令常用助记符MOV表示,根据数据传送的源和目的的不同,又可分为:
(1)主存单元之间的传送。
(2)从主存单元传送到寄存器。在有些计算机中,该指令用助记符LOAD表示。
(3)从寄存器传送到主存单元。在有些计算机里,该指令用助记符STORE表示。
(4)寄存器之间的传送。

2、堆栈操作指令

堆栈指令实际上是一种特殊的数据传送指令,分为进栈(PUSH)和出栈(POP)

3、数据交换指令

前述的传送都是单方向的。然而,数据传送也可以是双方向的,即将源操作数与目的操作数(一个字节或一个字)相互交换位置

1.4.2 运算符指令

1、算术运算类指令

算术运算指令主要用于定点和浮点运算。这类运算包括定点加、减、乘、除指令,浮点加、减、乘、除指令以及加1、减1、比较等,有些机器还有十进制算术运算指令。

2、逻辑运算类指令

计算机都具有与、或、非、异或等逻辑运算指令。

⑴ 按位测(位检查)
利用 “与” 指令可以屏蔽掉数据字(字节)中的某些位。通常让被检查数作为目的操作数,屏蔽字作为源操作数,要检测某些位,可使屏蔽字的相应位为 “1”,其余位为 “0”,如何执行 “与”指令,则可取出所要检查的位来。

⑵ 按位清(位清除)
利用“与”指令还可以使目的操作数的某些位置“0”。只要源操作数的相应位为“0”,其余位为“1,然后执行“与”指令即可。

⑶ 按位置(位设置)
利用“或”指令可以使目的操作数的某些位置“1”。只要源操作数的相应位为“1”,其余位为“0”,然后执行“或”指令即可。

⑷ 按位修改
利用“异或”指令可以修改目的操作数的某些位,只要源操作数的相应位为“1”,其余位为“0”,异或之后就达到了修改这些位的目的(因为A⊕1= , A⊕0=A)。

⑸ 判符合
若两数相符合,其异或之后的结果必定为“0”。

3、移位类指令

移位指令分为算术移位、逻辑移位和循环移位三类,它们又可分为左移和右移两种。
(1)算术移位
左移一位时,如不产生溢出,则数值×2;而右移一位时,如不考虑因移出舍去的末位尾数,则数值÷2

(2)逻辑移位
逻辑移位的对象是无符号数,因此移位时不必考虑符号问题。

(3)循环移位
循环移位按是否与进位一起循环又分为两种:小循环(不带进位循环)、大循环(带进位循环)

1.4.3 程序控制类指令

1、转移指令

(1)转移指令分为无条件转移条件转移
(2)无条件转移又称为必转,它在执行时将改变程序的常规执行顺序,不受任何条件的约束,其助记符一般为JMP。
(3)条件转移必须受到条件的约束,若条件满足时才执行转移,否则程序仍顺序执行。
(4)无论是条件转移还是无条件转移都需要给出转移地址。若采用相对寻址方式即(PC)+位移量→PC;若采用绝对寻址方式即A→PC。

2、子程序调用指令

子程序调用指令,简称转子指令,其助记符一般为CALL。

3、返回指令

从子程序转向主程序的指令称为返回指令,其助记符一般为RET,子程序的最后一条指令一定是返回指令。

1.4.4 输入输出类指令

1、独立编址

独立编址方式使用专门的输入/输出指令(IN/OUT)。以主机为基准,信息由外设传送给主机称为输入,反之称为输出。

2、统一编址

统一编址就是把外设寄存器和主存单元统一编址。在这种方式下,不需要专门的I/O指令,就用一般的数据传送类指令来实现I/O操作。

3、两种编址方式比较

以上是关于)的主要内容,如果未能解决你的问题,请参考以下文章

码字,层,层映射,预编码

408计算机组成原理—奇偶校验码

主存/外存层次和cache/主存层次的共同点

使用编码字的 MIME 标头中的换行符是不是合法?

主存与Cache间组相联映射计算

浅谈主存和Cache间的地址映射