上一章着重讲了指令,我们用汇编、C语言等工具编写的代码最终也被转化成机器指令被执行。本章进一步阐述编程语言如何被加载和执行的过程。
我们给出一段类似C语言的代码,作为本书电路的“hello world”程序,看看电路之间如何配合才能完成执行这个代码的目标。
试着分析这3行代码:
1、a=6,a在高级语言中是一个变量,其本质是一个内存地址;a=6的意思是在a地址的内存空间中存入数字6;本章为了讲解过程进一步简化,假设这两句已经执行完毕。
2、c=a+b,首先把a和b的内存空间中的数字,用加法器加起来,得到一个结果值9,然后把9存储到c这个地址的内存空间中。
图 6-1 本章代码内存示意图
指令操作码 | 指令地址 | 说明 |
---|---|---|
0000 0000 | 0000 1100 | 读取被加数a的值到加法站暂存器 |
0000 0001 | 0000 1010 | 从内存读取加数,并相加 |
0000 0010 | 0000 1101 | 将相加的结果存储内存 |
从上一章详细阐述了指令寄存器从内存中取出代码指令,然后控制指令的执行。但是他只负责具体执行一条指令,给它什么指令,它就去完成,可见背后还应该有一个“指挥棒”,把需要执行的指令给指令寄存器,等他执行完成后,把下一个指令给它。
需要设计一个程序执行控制模块,来做这个“指挥棒”,我们来试着分析它如何工作。
如图 6-1,内存被分成代码区和数据区两部分,代码区从内存的0000 0000位置开始。根据我们的电路设计,指令的格式是8位的操作码加上8位的操作地址(见图 5-1),我们的内存被设计成8位的存储单元,每一个内存地址下可以存放一个8位的数据。所以一个完整指令在内存中被分两行存储。
图 6-2 计数寄存器对指令寄存器的控制示意图
图 6-2所示,指令寄存器通过对其他的寄存器的控制来执行指令,程序运行控制模块则通过控制指令寄存器的运行,达到控制整个电路运行的效果。首先,电路通电后,“程序运行控制逻辑模块”中PC寄存器放着内存中存放代码的首地址(图 6-1的0000 0000地址),然后反复执行如下步骤:
1.控制指令操作寄存器(IR_OP)把第一个指令的操作码取出(内存设置可读,IR_OP设置可写);
2.PC寄存器地址加1;
3.控制指令地址寄存器(IR_ADDR)把第一个指令的操作地址取出(内存设置可读,IR_ADDR设置可写);
4.指令地址寄存器(IR_ADDR)设置为可读,设定好指令操作过程中的内存地址;
5.指令操作寄存器(IR_OP)设置为可读,按照指令码运行相应的指令逻辑;
6.PC寄存器地址加1;
每完成一次6个步骤的循环,则完成内存中的一个指令的执行,并准备进入下一个指令的执行。
为了实现反复执行以上6步,电路设计的大概思路是用一个三进八出的译码器,输出端对应这6个步骤,输入端循环输入二进制的0~5。
全部0条评论
快来发表一下你的评论吧 !