表7-1给出了四条典型指令组成的一个简单程序,其中LDA是数据传送指令,ADD是加法指令,STR是存操作数指令,JMP是无条件转移指令,实现程序顺序控制。本小节通过每一条指令取指阶段与执行阶段的分解动作,来具体认识每一条指令的指令周期。
表7-1 典型指令组成的一个简单程序
十六进制数地址
|
十六进制数代码
|
助记符
|
指令功能说明
|
0010
|
3E00
|
LDA
00H
|
AC←00H
|
0011
|
18E0
|
ADD [E0H]
|
AC←(AC)+(00E0H)
|
0012
|
10F0
|
STR [F0H]
|
00F0H←(AC)
|
0013
|
6011
|
JMP 11H
|
PC←0011H
|
…
|
…
|
…
|
…
|
00E0
|
0005
|
数据
|
|
00E1
|
0020
|
…
|
…
|
00F0
|
存放和数
|
1.
LDA指令的指令周期
在第二个CPU周期,即执行指令阶段,CPU根据对指令操作码的译码或测试,进行指令所要求的操作。对非访内指令来说,执行阶段通常涉及到对累加器进行操作,如累加器内容清零、求反等操作。显然,其他一些零地址格式的指令,执行阶段也仅需要一个CPU周期。
图7-7
LDA 00H的取指周期操作
(1)取指周期
LDA的取指周期操作如图7-7所示,在此阶段内,CPU的操作如下:
①程序计数器PC的内容0010H被装入地址寄存器AR;
② 程序计数器内容加1,变成0011H,为取下一条指令做好准备;
③ 地址寄存器的内容被放到地址总线上;
④ 所选存储器单元0010H的内容经过数据总线,传送到数据缓冲寄存器DR;
⑤ 缓冲寄存器的内容传送到指令寄存器IR;
⑥ 指令寄存器中的操作码被译码或测试;
⑦ CPU识别出是指令LDA,至此,取指令阶段即告结束。
需要说明的是,取指周期的过程和数据通路对每条指令来说都是一样的,所不同的是PC的值和取得的指令代码不一样。后续指令ADD、STR、JMP的取指周期与LDA指令相同,因此,不必重复讨论。
(2)执行指令阶段
LDA指令的执行阶段如图7-8所示,在此阶段内,CPU的操作如下:
①经译码后知道LDA 00H指令采用立即寻址方式,操作数跟在操作码之后,已经存放在指令寄存器IR中,操作控制器送出控制信号,在IR与数据缓冲寄存器DR之间建立数据通路,把立即数打入DR;
② 操作控制器再送出控制信号在DR与ALU之间建立数据通路,把立即数送到ALU的输入端;
③ ALU响应传送操作控制信号,将输入ALU的数据送到累加寄存器AC,从而执行了LDA 00H指令。
图7-8 LDA指令执行阶段
2.ADD指令的指令周期
取出第一条指令LDA时,PC的内容已经加1变成了0011H,这个地址指向存放“ADD [E0H]”指令的内存单元,所以接下来执行的指令是ADD [E0H]。
ADD指令是一条访问内存取数并执行加法的指令,它的指令周期由三个CPU周期组成,如图7-9所示。其中第一个CPU周期为取指令阶段;执行阶段由两个CPU周期组成:
http://online.ncu.edu.cn/eol/common/ckeditor/openfile.jsp?id=DBCPDCDHDADGDECPDBCOGCGNHA
其中在第二个CPU周期中完成从内存单元取出操作数,第三个CPU周期执行加法操作。
(1)取指令阶段
ADD指令的第一个CPU周期完成取指令操作并对指令译码。ADD指令取出后,PC=0012H。
(2)取操作数
第二个CPU周期主要完成送操作数地址,访问内存单元取操作数。此阶段的操作如图7-10所示,在此阶段内,CPU的操作如下:
① 把指令寄存器中的地址码部分(E0H)装入地址寄存器AR,其中00E0H为内存中存放操作数的地址;
② 把地址寄存器中的操作数的地址(00E0H)发送到地址总线上;
③
由存储器单元00E0H中读出操作数(0005H),并经过数据总线传送到缓冲寄存器。
图7-10 ADD指令的取操作数阶段
(3)执行加法操作
第三个CPU周期主要完成加法操作如图7-11所示,在此阶段,CPU完成如下动作:
图7-11 ADD指令的加法操作阶段
由数据缓冲寄存器来的操作数(0005H)可送往ALU
的一个输入端,已等候在累加器内的另一个操作数(因为LDA 00H指令执行结束后累加器内容为零)送往ALU的另一输入端,于是ALU将两数相加,产生运算结果为0+0005H=0005H。这个结果放回累加器,替换了累加器中原先的数0000H。
3.
STR指令的指令周期
取出ADD [E0H]指令时,PC的内容已经加1变成了0012H,这个地址指向存放“STR [F0H]”指令的内存单元,所以接下来执行的指令是STR [F0H]。
http://online.ncu.edu.cn/eol/common/ckeditor/openfile.jsp?id=DBCPDCDHDADGDHCPDBCOGCGNHA
STR
[F0H]是一条直接寻址指令,把累加器AC的内容存入内存单元,它的指令周期由二个CPU周期组成,如图7-12所示。其中第一个CPU周期为取指令阶段,第二个CPU周期为存操作数。
(1)取指令阶段
STR [F0H]指令的第一个CPU周期完成取指令操作并对指令译码。STR指令取出后,PC=0013H,为取下一条指令作好了准备。
(2)存操作数
第二个CPU周期主要完成送操作数地址,访问内存单元存操作数。此阶段的操作如图7-13所示,在此阶段内,CPU的操作如下:
图7-13 STR
[F0H]指令的执行阶段
①把指令寄存器中地址码部分的形式地址F0H装到地址寄存器AR。
②累加器AC的内容(0005H)被传送到数据缓冲寄存器DR;
③把地址寄存器AR的内容(00F0H)发送到地址总线上,00F0H即为将要存入的数据0005H的内存单元地址;
④ 把缓冲寄存器DR的内容(0005H)发送到数据总线上
⑤ 操作控制器发出写WR控制信号,将0005H写入到存储器00F0H单元中。
注意:在这个操作之后,累加器中仍然保留和数0005H,而存储器00F0H单元中原先的内容被修改。
4.
JMP指令的指令周期
STR [F0H]指令取出后,PC=0013H,因此下一条要执行的指令是存放在0013H单元的“JMP
11H”指令。JMP是一条程序控制转移指令,其指令周期由两个CPU周期组成,如图7-14所示。其中第一个CPU周期为取指令阶段,第二个CPU周期为执行阶段。
http://online.ncu.edu.cn/eol/common/ckeditor/openfile.jsp?id=DBCPDCDHDADGDJCPDBCOGCGNHA
(1)第一个CPU周期(取指令阶段)
CPU把0013H号单元的“JMP
11H”指令取出送到指令寄存器IR,同时程序计数器PC内容加1,变为0014H,指令译码后知道IR中的指令是无条件转移指令。
(2)第二个CPU周期(执行阶段)
CPU把指令寄存器IR中地址码部分0011H送到程序计数器,从而用新内容0011H代替PC原先的内容0014H。这样,下一条指令将不从0014H单元读出,而是从内存0011H单元开始读出并执行,从而改变了程序原先的执行顺序。JMP指令执行阶段的操作如图7-15所示。
图7-15 JMP
11H的执行阶段
注意:执行“JMP
11H”指令时,我们这里所给的四条指令组成的程序进入了死循环,除非人为停机,否则这个程序将无休止地运行下去,因而内存单元00F0H中的和数将一直不断地发生变化。当然,我们此处所举的转移地址0011H是随意的,仅仅用来说明转移指令能够改变程序的执行顺序而已。
加载中,请稍候......