plc程序中怎么选择关闭分支

plc程序中怎么选择关闭分支,第1张

用户可以在plc程序中使用“控制”/“分支”/“晌段结束(终止)纳睁”命宴茄誉令来关闭分支。 当你的程序运行到此命令时,plc将停止处理当前分支中的语句,并开始处理下一个语句(不是分支中的语句)。

可以看到在执行php时,  是一条一条去执行核州的

1.先判断  $a  是否 等于 1

2.如果不等于1,为false, 就JMPZ 到第4条命令,去比较  $a 是否 等于2

   如果等于1, echo "a is 1"然后改饥蔽 无条件跳转 JMP 第9行 return 了

3.如果 $a 不等于2 ,即为false, 就JMPZ 到第8条命令, echo "a is x" 

   如果  $a 等于2,直接echo "a is 2", 然后执行 JMP 第9行 return 了

所以,php编写的程序,对C函数来说,还是要一步的一步去执行的,关于具体php的分支实现,请点击这里

 

如果这个文件被执行100次,有90次 $a=3, 那么解释器每次都要判断 $a 是否等于1和  $a 是否等于2, 尽管第三个分支是满足条件的,如果是C编写的程序, CPU会针对某种策略挑选一个分支来执行, 对应上面的分支来说,CPU会直接取出第三个分支的指令,然后执行。

     从486开始,CPU开始具备流水线这个特性,指令流水线由5,6个不同功能的工作单元组成,将一个x86指令也拆分成5,6个步骤,分别送往不同的肢陵工作单元,来达到同时执行多个指令的目的,现在的CPU支持30级的流水线,也就意味着流水线上有30个工作单元,对应的X86指令也拆分成30个步骤。

注:CPU执行的是二进制数据,代码经过汇编编译后,生成一条条二进制指令

   例如 int a=1对应的汇编是mov $1, %eax对应的机器码可能是00011100011

在执行文件时,根据局部性原理,想关的指令都要加载到CPU缓存中,

一般一条指令的完成 分四个步骤:

1.取指令

2.翻译指令 (看是赋值,还是计算,从内存什么地方取数据)

3.执行指令

4.写指令结果 (要么写回内存,要么写到寄存器)

   取指令翻译指令执行指令写指令结果

                    命令1      命令1

                    命令2

取指令单元取出指令1后,翻译指令单元开始 翻译指令1时,取指令单元可 取出指令2了

 

如果CPU不这么做,等到指令1完成上面四个步骤后,指令2才开始进行,那效率太低了

 

流水化中的单元分的更详细, 更多的指令可以并行处理,但速度不见得快,因为有分支的出现,如果没有命中第一个分支,后面的指令将作废, 需要清空后面所有的指令, 然后中载命中地址的指令,再运行

 

      在有5个分支的情况下,若采取随机挑选一个分支 执行的话,每次赌该分支命中的概率只有五分之一, 于是CPU分支预测功能就出现了。

      分支预测分静态和动态

      静态分支预测:由编译器决定哪个分支可能被CPU命中,一般是第一个分支,即 if 后面的逻辑,而不是后面else的逻辑

      动态分支预测:在CPU硬件中开辟一块缓存,专门记录每个分支最近几次的命中情况,然后做出预测,显然这种方法能及时调整策略,有更好的远詹性,但CPU压力会大些,不过还好。

分支地址只有在流水线指令执行阶段才能计算出来,为了避免等待,需要在译码阶段进行预测

Two-Level分支预测方法使用了两种数据结构,一种是BHR(Branch History Register);而另一种是PHT(Pattern History Table)。其中BHR由k位组成(可理解为记录K次某个分支的执行结果),用来记录每一条转移指令的历史状态,而PHT表含有2k个Entry组成,而每一个Entry由两位Saturating Counter组成。BHR和PHT的关系如图3‑10所示。

假设分支预测单元在使用Two-Level分支预测方法时,设置了一个PBHT表(Per-address Branch History Table)存放不同指令所对应的BHR。在PBHT表中所有BHR的初始值为全1,而在PHT表中所有Entry的初始值值为0b11。BHR在PBHT表中的使用方法与替换机制与Cache类似。

当分支预测单元分析预测转移指令B的执行时,将首先从PBHT中获得与转移指令B对应的BHR,此时BHR为全1,因此CPU将从PHT的第11…11个Entry中获得预测结果0b11,即Strongly Taken。转移指令B执行完毕后,将实际执行结果Rc更新到BHR寄存器中,并同时更新PHT中对应的Entry。

当CPU再次预测转移指令B的执行时,仍将根据BHR索引PHT表,并从对应Entry中获得预测结果。而当指令B再次执行完毕后,将继续更新BHR和PHT表中对应的Entry。当转移指令的执行结果具有某种规律(Pattern)时,使用这种方法可以有效提高预测精度。如果转移指令B的实际执行结果为001001001….001,而且k等于4时,CPU将以0010-0100-1001这样的循环访问BHR,因此CPU将分别从PHT表中的第0010、0100和1001个Entry中获得准确的预测结果。

由以上描述可以发现,Two-Level分支预测法具有学习功能,并可以根据转移指令的历史记录产生的模式,在PHT表中查找预测结果。该算法由T.Y. Yeh and Y.N. Patt在1991年提出,并在高性能处理器中得到了大规模应用。

Two-Level分支预测法具有许多变种。目前x86处理器主要使用“Local Branch Prediction”和“Global Branch Prediction”两种算法。

微机分支程序结构程序设计出现的问题及解决办法:

一、实验内容

熟悉循环结构设计与调试

题目1要求:从NN单元开始的10个连续单元中存放有10个无符号数,从中找出最小的送入MM单元中。

流程图:

选做题要求:试编写一程序,要求比较两个字符串SREING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NOMATCH”.

二.实验步骤橘和

1.将MASM文件夹复制到D:盘根目录下

2.将编好的代码复制到MASM文件夹中,扩展名改为’.asm’

3.搭建DOSBox-汇编环境

4.mount c: d:\wmasm 回车后键入C:,回车

5.对源文件进行汇编

c:\masm xff1228.asm回车

连续输入三个回车(若提示有错误返回源文件修圆亮盯改并重复此步骤)

6.对目标文件进行链接

c:\link xff1228.obj回车

连续键入三个回车键贺

7.运行程序

c:\xff1228.exe回车

8.调试程序


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12309276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存