控制码

Posted 胡韬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制码相关的知识,希望对你有一定的参考价值。

1.条件码

  cpu除了维护整数寄存器外,还维护着一组单个位的条件码寄存器,它们用于描述最近的算术/逻辑操作的属性。

  例:CF,进位标示

    ZF,零标示

    SF,符号标示 

      OF,溢出标示

2.访问条件码

  条件码寄存器不能直接读取,有三种方法:

  • set指令:根据条件码,设置一个字节。
  • jump指令:根据条件码进行跳转,即控制的条件转移。
  • cmov条件传送指令:根据条件码决定是否进行mov操作(其性能要优于控制的条件转移P141)
条件传送指令:
先上一段C代码:
技术分享
 
gcc不做优化的编译:gcc -S test.c:
技术分享
 
可以看到汇编代码出现了jle这样的跳转指令。对于使用了流水线的CPU,这样的跳转是存在隐患的(P140),分支预测失败就会刷新掉所有流水线中取到而未执行的指令,影响运行性能
 
现在添加优化选项:gcc -S O1 test.c
技术分享
 
可以看到经过优化后的代码没有了跳转指令,取而代之的是一个条件传送指令——cmovle。它对cmpl比较的结果进行判断,决定是否改变%eax的值。
注意,程序前面已经把a-b和b-a都求出来了,即先求出条件操作的两种结果,然后再根据条件是否满足从而选取一个。
 
总之,条件传送指令使得控制流不依赖于数据(关键是没了jump),流水线也更容易保持满状态。
参考:CSAPP,Nestler的博客。

 

以上是关于控制码的主要内容,如果未能解决你的问题,请参考以下文章

【实战】electron 制作远程控制软件(预)

Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)

phpstorm怎么添加码云的版本控制器

Wasm介绍之5:控制指令

播放 2 scala 路由控制器字节码与所有其他字节码不同

Codecs系列码率控制之VBV实现原理