整理自学院网站

1. 指令的基本格式

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

其中操作码指明了指令的操作性质及功能,地址码则给出了操作数的地址。

地址码中的地址可以是主存的地址,也可以是寄存器的地址(编号),甚至可以是I/O设备的地址。

对于双操作数运算指令来说,需要操作数的地址、结果的地址以及下一条指令的地址,这些地址可以在指令中明显给出,称为显地址;
也可以依照某种事先的约定,用隐含的地址给出,称为隐地址。

根据显地址的个数有:三地址和二地址指令(通用寄存器指令)、一地址指令(累加型计算机)和零地址指令(堆栈型计算机)。

2.定长操作码指令格式

定长操作码以称为规整型编码,这是一种最简单的编码方法,操作码字段的位数和位置是固定的。

为了能表示整个系统中的全部指令,指令的操作码字段应当有足够的位数。

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

3.扩展操作码指令格式

扩展操作码以称为非规整编码,操作码字段的位数不固定,且分散地放在指令字的不同位置上。

这种方式能够有效地压缩指令中操作码字段的平均长度,显然,操作码字段的位数和位置不固定将增加指令译码和分析的难度,使控制器的设计复杂化。

典型的扩展操作码编码让操作数地址个数多的指令(三地址指令)的操作码字段短些,操作数地址个数少的指令(一或零地址指令)的操作码字段长些,这样既能充分地利用指令的各个字段,又能在不增加指令长度的情况下扩展操作码的位数,使它能表示更多的指令。

4.指令的寻址方式

(1)立即寻址

立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的部分不是通常意义上的操作数地址,而是操作数本身。

(2)寄存器寻址

寄存器寻址指令的地址码部分给出某一个通用寄存器的编号Ri,这个指定的寄存器中存放着操作数。
有效地址EA=Ri。
这种方式可以缩短指令长度,提高指令的执行速度。

(3)直接寻址

指令中地址码字段给出的地址A就是操作数的有效地址,即形式地址等于有效地址:EA=A。

由于这样给出的操作数地址是不能修改的,与程序本所在的位置无关,所以又叫绝对寻址方式。

(4)间接寻址

间接寻址意味着指令中给定的地址A不是操作数的地址,而是存放操作数地址的主存单元的地址,简称为操作数地址的地址,即EA=(A)。

间接寻址的指令在执行阶段要多次访存,可扩大寻址范围,便于编制程序。

(5)寄存器间接寻址

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

这种寻址方式的指令较短,并且在取指后只需一次访存便可得到操作数,因此指令执行的速度较间接寻址方式快。

(6)变址寻址

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

Rx的内容称为变址值。

(7)基址寻址

基址寻址是将基址寄存器Rb的内容与指令中给出的位移量D相加,形成操作数有效地址,即EA=(Rb)+D。

Rb的内容称为基址值。

(8)相对寻址

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

位移量指出的是操作数和现行指令之间的相对位置。

(9)页面寻址

存储器的有效地址就被分为两部分:前部分为页面地址,后部为页内地址。

页内地址是由指令的地址码自动直接提供,它与页面地址通过简单的拼装连接就可得到有效地址,无须进行计算,因此寻址迅速。

根据页面地址的来源不同,页面寻址以可分为三种不同的方式。

①基页寻址,又称为零页寻址。由于页面的地址全等于0,所以有效地址EA=0//A。基页寻址实际就是直接寻址。

②当前页寻址。页面地址就等于程序计数器(PC)的高位部分的内容,所以有效地址EA=(PC)H//A,操作数S与指令本身处于同一页面中。

③页寄存器地址。页面地址取自页寄存器,与形式地址相拼接形成有效地址。

(10)堆栈寻址

堆栈是一种按特定顺序进行存取的存储区,这种特定的顺序可归结为“后进先出(LIFO)”或“先进后出(FILO)”。
寄存器堆栈由 一组专门的寄存器构成,又称为硬堆栈。这种堆栈的栈顶是固定的,寄存器组中各寄存器是互相连接的,它们之间具有对应位自动推移的功能,即可将一个寄存器的内容推移到相邻的另一个寄存器中去。
利用主存的一段区域构成的堆栈称为软堆栈,软堆栈的大小可变,栈底固定,栈顶浮动,故需要一个专门的硬件寄存器作为堆栈的栈顶,简称堆栈指针(SP)。
若软堆栈的栈底地址大于栈顶地址,且栈指针始终指向栈顶的满单元,则

进栈时的操作:
(SP)-1→SP 修改栈指针
(A)→(A) 将A中的内容压入栈顶单元

出栈时操作:
((SP))→A 将栈顶单元的内容弹出送入A中
(SP)+1→SP 修改栈指针

5.CISC和RISC

基于复杂指令系统设计的计算机称为复杂指令系统计算机(CISC),基于精简指令系统设计的计算机称为精简指令系统计算机(RISC)。

RISC的中心思想是要求指令系统简化,尽量寄存器-寄存器操作指令,除去访存指令(Load和Store)外,其他指令的操作均在单周期内完成,指令格式力求一致,寻址方式尽可能减少,并提高编译的效率,最终达到加快机器处理速度的目的。

- CISC RISC
指令数目 一般大于200条 一般小于100条
指令系统 复杂,庞大 简单,精简
管线 \$1 234
指令字长 不固定 等长
寻址方式 一般大于4 一般小于4
可访存指令 不加限制 只有LOAD/STORE指令
各种指令执行时间 相差较大 绝大多数在一个周期内完成
通用寄存器数量 较少
控制方式 绝大多数为微程序控制 绝大多数为硬布线控制

6.题

【例4.1】在关于一地址运算类指令的叙述中,正确的是( B )。

A.仅有一个操作数,其地址由指令的地址码提供
B.可能有一个操作数,也可能有两个操作数
C.一定有两个操作数,另一个是隐含的
D.指令的地址码字段存放的一定是操作码

试题分析:一地址运算类指令包括单操作指令(如加1、减1指令)和双操作数指令(如加、减指令)两类。对于单操作数指令只需要一个操作数,对于双操作数指令需要有两个操作数,其中一个操作数的地址是显地址,另一个操作数的地址隐含在累加寄存器中。

【例4.3】一个计算机系统采用32位单字长指令,地址码为12位,如果定义了250条二地址指令,那么单地址指令的条数有( D )。

A. 4K
B. 8K
C.16K
D.24K

试题分析:二地址指令的操作码字段8位,现定义了250条二地址指令,采用扩展操作码技术,留下6个扩展口,每个扩展窗口可以扩展212=4K 条一地址指令,故共可扩展6×4K=24K条一地址指令。

【例4.4】指令操作所需的数据不会来自(D  )。

A.寄存器
B.指令本身
C.主存
D.控制存储器

试题分析:指令操作所需的数据可能来自于指令本身(立即寻址),可能来自于寄存器(寄存器寻址)或主存单元(多种寻址方式),但不会来自控制存储器。

【例4.6】在寄存器间接寻址方式中,操作数存放在(  D)。

A.寄存器 B.堆栈栈顶 C.累加器 D.主存单元

试题分析:在寄存器间接寻址中,指定寄存器里存放着有效地址,而操作数在主存中。

【例4.7】变址寻址和基址寻址的有效地址形成方式类似,但( D )。

A.变址寄存器的内容在程序执行过程中是不可能变的
B.基址寄存器的内容在程序执行过程中是不可能变的
C.在程序执行过程中,变址寄存器的内容不能改变而基址寄存器的内容可变
D.在程序执行过程中,基址寄存器的内容不能改变而变址寄存器的内容可变

试题分析:通常,变址寻址中变址寄存器提供修改量(可变的),而指令中提供基准值(固定的);基址寻址中基址寄存器提供基准值(固定的),而指令中提供位移量(可变的)。

【例4.8】为实现程序浮动提供了较好支持的建起方式是(B  )。

A.变址寻址
B.相对寻址
C.间接寻址
D.寄存器间接寻址

试题分析:相对寻址的操作数地址随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值。所以以相对寻址方式编写的程序可在主存中任意浮动。

【例4.11】设变址寄存器为X,形式地址为D,某机具有先间址后变址的寻址方式,则这种寻址方式的有效地址为( B )。

A. EA=(X)+D
B. EA=(X)+(D)
C. EA=((X)+D)
D. EA=X+D

试题分析:A选项是变址寻址,C选项为先变址后间址,D选项的表达式不对。

【例4.13】零地址的运算类指令在指令格式中不给出操作数地址,参加运算的两个操作数来自( C )。

A.累加器和寄存器
B.累加器和暂存器
C.堆栈的栈顶和次栈顶单元
D.暂存器和堆栈的栈顶单元

试题分析:零地址运算类指令的两个操作数均来自于堆栈,分别在栈顶和次栈顶单元。

【例4.18】某机字长32位,指令单字长,指令系统中具有二地址指令、一地址指令和零地址指令若干条,已知每个地址长12位,采用扩展操作码方式,问该指令系统中的二地址指令、一地址指令、零地址指令各最多能有多少条?

解答:28-1,(28-1)×212-1,232-224-212

试题分析:设指令字长固定,为32位,每个地址字段为12位,因此,零地址指令的操作码占32位,一地址指令的操作码占20位,二地址指令的操作码占8位。
对于二地址指令,至少需要留出一个扩展口给一地址指令,显然最多可以有28—1条二地址指令。对于一地址指令,最多的情况是指令系统中只有一条二地址指令,并要为零地址指令留下一个扩展口,显然最多可以有(28-1)×212-1条一地址指令。对于零地址指令,最多的情况是指令系统中只有一条二地址指令和一条一地址指令,其余均为零地址指令。零地址指令的操作码为32位,共有232种编码,其中224种编码用作表示某条二地址指令,212种编码用作表示某条一地址指令,因此零地址指令最多可以有232-224-212条。