一、计算机执行一条指令的步骤是取指令和执行指令……?
先对上图进行说明:
CO,J,CE为程序计数器的输出允许,输入允许,加1 允许控制线
AI,AO是寄存器A的输入允许,输出允许
那么其他的线相应控制着其他的寄存器。
开始
这里有三行汇编指令:
LDA 0x01 ; 把寄存器A设置为1
ADD 15 ; A+ 15
OUT : 把结果输出
这个指令对应的机器码是我们人为规定的,我们规定:LDA为0001,
那么汇编指令对应的机器码为:0001 0001
我们把这个机器码放在内存的地址0x00处
规定ADD对应的机器码为0010, 15对应1111,所以这条指令的机器码为:0010 1111
将这条指令存放在 内存地址0x01处
规定OUT这条指令的机器码为0011 那么这条执行对应的机器码为 0011 xxxx, 这里xxxx就是任意值的意思,我们把0011 xxxx放在内存地址的0x10处。
这样在内存地址0x00: 0001 0001
这样在内存地址0x01: 0010 11111
这样在内存地址0x02: 0011 xxxx
这3个字节就是我们上面的3行汇编代码对应的机器码
计算机上电后,
在第1个计算机时钟的上升沿:程序计数器为0,我们控制程序计数器将数值0输出到总线,并控制内存地址寄存器从总线获取到0
在第2个计算机时钟的上升沿:设定内存RAM为可输出,指令寄存器为可输入。由于内存地址寄存器中为0,所以内存此时输出地址0处的内容到指令寄存器IR中,IR中的内容就改变为:0001 0001. 同时控制程序计数器加1.
在第3个计算机时钟的上升沿:设置 IR的数据可输出,这样IR的后半部分0001代表的数字1就放到了总线上。 由于 IR的前半部分是0001,这个经过cpu控制器的解码,会设置寄存器A为可输入,这就将总线上的数据0读入到了寄存器A中。cpu控制器的作用就是将LDA对应的编码0001 转换成一串01,这串01,控制所有的寄存器,内存,但是这里我们只将IR可输出控制线 设置为1,设置A可输入控制线设置为1。其他的寄存器都设为不允许。
在第4个计算机时钟的上升沿:程序计数器为1,我们控制程序计数器将数值1输出到总线,并控制内存地址寄存器从总线获取到1
在第5个计算机时钟的上升沿:设定内存RAM为可输出,指令寄存器为可输入。由于内存地址寄存器中为1,所以内存此时输出地址1处的内容到指令寄存器IR中,IR中的内容就改变为:0010 1111. 同时控制程序计数器pc加1=2.
在第6个计算机时钟的上升沿:设置 IR的数据可输出,这样IR的后半部分1111代表的数字15就放到了总线上。 由于 IR的前半部分是0010,这个经过cpu控制器的解码,会设置寄存器B为可输入,这就将总线上的数据15读入到了寄存器B中。cpu控制器的作用就是将ADD对应的编码0010 转换成一串01,这串01,控制所有的寄存器,内存,但是这里我们只将IR可输出控制线 设置为1,设置B可输入控制线设置为1。其他的寄存器都设为不允许。 由于A和B都连在累加器ALU上,所以此时ALU已经完成了A+B=1+15=16的结果。
在第7个计算机时钟的上升沿:程序计数器为2,我们控制程序计数器将数值2输出到总线,并控制内存地址寄存器从总线获取到2
在第8个计算机时钟的上升沿:设定内存RAM为可输出,指令寄存器为可输入。由于内存地址寄存器中为1,所以内存此时输出地址1处的内容到指令寄存器IR中,IR中的内容就改变为:0011 xxxx 同时控制程序计数器pc加1=3.
在第9个计算机时钟的上升沿: 由于 IR的前半部分是0011,这个经过cpu控制器的解码,会设置寄存器ALU为可输输出,这就将16输出到了总线上。同时设置OUT寄存器为可输入,这就将16输入到了OUT中,就会把16显示出来。 cpu控制器的作用就是将OUT对应的编码0011 转换成一串01,这串01,控制所有的寄存器,内存,但是这里我们只将ALU可输出控制线 设置为1,设置OUT可输入控制线设置为1。其他的寄存器都设为不允许。 这样OUT和显示器直接相连,这就完成了数字16的显示。
以上就是三句代码在CPU里的执行过程了。
注意到 在第1/4/7个计算机时钟的上升沿,我们总是控制内存地址寄存器MAR从程序计数器PC获取数据
注意到 在第2/5/8个计算机时钟的上升沿,我们总是控制从内存从拿出地址对应的值到指令寄存器IR中。
第1,2两个时钟上升沿,完成了把指令LDA 0x01对应的机器码00010001读取到指令寄存器IR中。
第4,5两个时钟上升沿,完成了把指令ADD 15对应的机器码0010 1111读取到指令寄存器IR中。
第7,8两个时钟上升沿,完成了把指令OUT对应的机器码0011xxxx 读取到指令寄存器IR中。
也就是说,我们写的代码就是这样,一句一句的被读入指令寄存器的。
代码读入指令寄存器后,指令寄存器中高位4个值就会输入到cpu控制器中,cpu在控制器就会输出相应的控制动作,打开某些寄存器的输入口,输出口等。
这些动作都在第3,6,9个时钟周期实现。
由于每执行一句代码,总是需要先花费两个时钟的上升沿,将指令码和操作数读区到指令寄存器IR中,所以,我们有了微指令周期的概念。
比如我们这里一个微指令周期内,就包含3个时钟上升沿.
在一个微指令周期内,先用两个时钟上升沿,将具体的指令码读取到指令寄存器IR中,然后再用1个时钟上升沿,去根据指令机器码对应的控制逻辑,去改变寄存器或者累加器的输入输出控制线。从而完成代码所表示的功能。
也就是说,每句代码,在计算机中执行,都需要一个微指令周期来执行。
每个微指令周期都包含3个时钟上升沿。
每个微指令周期的前两个时钟上升沿用于将代码对应的指令码和操作数存放到指令寄存器里,在第3个时钟上升沿,才会去控制各种寄存器的控制线,完成代码所指示的功能。
当然,在当代码功能比较繁琐时,一个微指令周期可能需要不止3个上升沿。
那么问题来了,CPU控制器该如何设计?
另外,汇编指令在运行前,被编译成机器码,那么C语言在运行前,是如何被编译成机器码的?
还有,以上的每一个寄存器,累加器都可以买到一些小芯片快速的搭建出来,这也意味着,如果你想自己搭建一台计算机,按照这个思路是可行的。
实际上你搜索图片右上角的BenBlue就会看到一些教程。
二、51单片机执行一条指令所需时间?
这个与单片机型号、指令类型和使用的晶振频率有关,比如AT89C51,是一个12个时钟周期等于1个机器周期的单片机,如果使用的晶振是12MHz的话,执行一条单指令的 NOP 需要 12x(1/12M)=1微秒的时间,
三、51单片机执行一条指令需多久?
这个与单片机型号、指令类型和使用的晶振频率有关,比如AT89C51,是一个12个时钟周期等于1个机器周期的单片机,如果使用的晶振是12MHz的话,执行一条单指令的 NOP 需要 12x(1/12M)=1微秒的时间,
四、8051单片机机一条乘法指令需要执行多长时间?
假如晶振频率是6MHz,机器周期是2μS,执行1条乘法指令是4机器周期,也就是8μS的时间。
假如晶振频率是12MHz,机器周期是1μS,执行1条乘法指令是4机器周期,也就是4μS的时间。
五、51单片机中执行一条乘法指令或者除法指令需要多少个机器周期?
一条乘法指令或者一条除法指令都需要 4 个机器周期。
指令周期是不确定的,因为她和该条指令所包含的机器周期有关。一个指令周期=1个(或2个或3个或4个)机器周期,像乘法或除法就含有4个机器周期,单指令就只含有1个机器周期。对于大多说的51单片机来说,1个机器周期=12个时钟周期(或振荡周期)。也有部分单片机时钟周期和振荡周期不相等,例如,1个时钟周期=2个振荡周期。
51单片机的功能:8位CPU·4kbytes程序存储器(ROM) (52为8K),128bytes的数据存储器(RAM) (52有256bytes的RAM),32条I/O口线·111条指令,大部分为单字节指令,21个专用寄存器,2个可编程定时/计数器·5个中断源,2个优先级(52有6个)。
六、51单片机程序里执行一条nop指令需要多长时间?
一个NOP是一个机器周期, 具体时间由晶振频率和单片机型号确定 原始的51是一个机器周期等于12个晶振周期 那么NOP的时间就是1/(频率*12)
七、上电复位后,单片机如何找到需要执行的第一条指令?
上电复位后,不同品牌的单片机执行的第一条指令的地址是不同的。
如51单片机,复位后,指令指针PC=0000H,即要求你编程的第一条指令放在0000H处。如PIC单片机复位后,指令指针PC=FFFH,即要求你编程的第一条指令放在0000H处。你明白了吗?八、什么指令需要执行总线周期指令?
mov [2000h],al”指令的代码是3个字节,所以进行指令读取(即取指)需要3个读取存储器的总线周期。这是指读取指令阶段,接着处理器执行该指令。
九、单片机执行一条指令所用的时间是多少?怎么算?
STC单片机可以设置12T,1T等不同的工作方式,12T和标准51单片机是一样的,一个机器周期为12/Fosc,如果选1T的话一个机器周期应该是1/Fosc.
十、cpu执行一条指令需要多少个时钟周期?
计算机中时钟周期是(主频的倒数),一个时钟周期cpu仅完成一个最基本的动作,完成一个基本操作的时间为机器周期,一般由几个时钟周期组成;完成一条指令为指令周期。一般由几个机器周期组成,指令不同机器周期数也不同。
以我的本本1.6G为例,机器周期由两个时钟周期组成,平均三个机器周期完成一条指令(这要假设,我看不到)时钟周期为1/(1.6*1024m)=0.61ns机器周期为0.61*2=1.22ns平均指令周期3*1.22ns=3.66ns平均指令执行速度为1/(3.66ns)=273.22MIPS(百万条指令每秒)这只是计算方法,条件也是假设的,晶振我不知。
大致算法就这样,我数学不好。如有算错请多指教!