控制码

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的博客。

时间: 2024-10-14 09:19:52

控制码的相关文章

C语言与VT100控制码编程

C语言与VT100控制码编程 声明: 1. 如果您打算阅读本文,希望您已经了解过C语言的基本语法,本文不对C语言的基本语法进行说明,因为那些东西几乎唾手可得; 2. 本文在vim中编辑,请尽量是用vim进行阅读,因为有不对齐的现象; 3. 本人强烈建议您先编译,运行本文最后提供的sinDemo源代码,再看本文的正文,因为您看了运行效果,您就知道本人为什么要写这篇文章; \\\\\\\\\\\\--*目录*--/////////// | 一. 需求背景 | | 二. VT100控制码是什么 | |

第十九天:vt控制码及数据结构

相比前些天的内容,今天的内容算是比较简单的.主要说了VT控制 码,三种排序算法:选择排序,冒泡排序,快速排序.二分查找.遍历二叉树还有posix的简单介绍.系统调用函数:open  close read write lseek fstat的使用. 关于vt控制码的学习,据老刘说是为了以后的小项目准备的.比如贪吃蛇,俄罗斯方块.目前只要知道基本的操作就行了.主要是对光标的控制.所有的VT100控制符是 /033打头(即ESC的ASCII码)用输出字符语句来输出.具体格式有两种 一种数字形式, /0

CloudStack API访问权限控制

在我写开始之前,请先看下CS中国社区的一篇文章http://www.cloudstack-china.org/2012/12/1465.html,在第1点里讲了关于权限级别,command属性文件位置等问题.不过4.3现在的除了command.properties外,作者提到的其它properties文件现在好像都没有了,而且command里面现在形如***command=15,"="后面不再有处理请求命令的类. API请求由ApiServlet拦截后,会调用verifyRequest

第一章 数制和码制

1.数字电路:工作在数字信号下的电子电路称为数字电路. 2.自然界中形形色色的物理量,就其变化规律的特点而言,可以分为两大类:(数字量)数字信号和模拟量(模拟信号). 3.数字量:物理量的变化在时间和数量上都是离散的,也就是说它们的变化在时间上是不连续的,总是发生在一系列离散的瞬间.而且,它们数值的大小和每次的增减变化都是某个最小数量单位的整数倍,而小于这个最小数量单位的数值没有任何物理意义. 4.模拟量:物理量的变化在时间或数值上是连续的.而且,物理量在连续变化过程中的任何一个取值都有具体的物

Linux Shell退出状态码

状态码 描述 0 命令成功结束 1 通用未知错误 2 误用Shell命令 126 命令不可执行 127 没找到命令 128 无效退出参数 128+x Linux信号x的严重错误 130 命令通过Ctrl+C控制码越界 255 退出码越界 状态码访问: $echo $?

ASCII码对照表

ASCII, American Standard Code for Information Interchange 念起来像是 "阿斯key",定义从 0 到 127 的一百二十八个数字所代表的英文字母或一样的结果与意义.由于只使用7个位元(bit)就可以表示从0到127的数字,大部分的电脑都使用8个位元来存取字元集(character set),所以从128到255之间的数字可以用来代表另一组一百二十八个符号,称为 extended ASCII. ASCII码 键盘 ASCII 码

ansi 控制码表及颜色代码

颜色代码: QUOTE: 字背景颜色范围: 40--49                  字颜色: 30--39 40: 黑                          30: 黑 41: 红                          31: 红 42: 绿                          32: 绿 43: 黄                          33: 黄 44: 蓝                          34: 蓝 45: 紫  

Asp.net下使用HttpModule模拟Filter,实现权限控制

在asp.net中,我们为了防止用户直接从Url中访问指定的页面而绕过登录验证,需要给每个页面加上验证,或者是在模板页中加上验证.如果说项目比较大的话,添加验证是一件令人抓狂的事情,本次,我就跟大家分享一个利用HttpModule实现权限验证的方法. 第一步: 在项目中新建一个类.cs文件,本例为Filter,应用一下命名空间,主要是为了访问Session. using System.Web.SessionState; 第二步:让这个类继承IHttpModel和IRequiresSessionS

过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解

今天产品部同事报告了一个BUG,经过调试发现,由于用户输入的字符串中,包含字符0x1E, 也就是”记录分隔符”(Record Separator, Notepad++ 显示为[RS]),导致JavaScript XML解析遭遇错误.于是就想在字符串中过滤掉这些没多大用途的字符,同时又要保留部分常用的字符,例如换行,回车和水平制表符.于是写了下面一个 PHP 函数: /** * 清理字符串中的部分不可见控制字符 * * @param string $string 待处理字符串 * @return