随笔三十一:条件码

        除了整数寄存器,CPU还维护着一组单个位的条件码(condition code)寄存器,它们描述了最近的算术和逻辑操作的属性。可以检测这些寄存器来执行条件分支指令。最常用的条件码有:

        CF:进位标志。最近的操作使最高位产生了进位。可以用来检查无符号操作数的溢出。

        ZF:零标志。最近的操作得出的结果为 0。

        SF:符号标志。最近的操作得到的结果为负数。

        OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。


        leal 指令不改变任何条件码,因为它是用来进行地址计算的。除此之外,随笔二十九中所列的所有指令都会设置条件码。

        除上述提到的指令外,有两类指令(有8、16 和 32 位形式),它们只设置条件码而不改变任何其他寄存器;如下图所示。CMP 指令根据它们的两个操作数之差来设置条件码。除了只设置条件码而不更新目标存储器之外,CMP 指令和 SUB 指令的行为是一样的。在 ATT 格式中,列出操作数的顺序是相反的,这使代码有点难读。如果两个操作数相等,这些指令会将零标志设置为 1,而其他的标志可以用来确定两个操作数之间的大小关系。TEST 指令的行为与 AND 指令一样,除了它们只设置条件码而不改变目的的寄存器的值。典型的用法是,两个操作数是一样的(例如,testl %eax, %eax 用来检查 %eax 是负数、零,还是正数),或其中一个操作数是一个掩码,用来指示哪些位应该被测试。

指令

基于

描述

  CMP        S2,    S1

S1 – S2

比较

  cmpb

  cmpw

  cmpl

        Compare byte

        Compare word

        Comlare double word

 

  TEST       S2,    S1

S1 & S2

测试

  testb

  testw

  testl

        Test byte

        Test word

        Test double word

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值