计算机底层——条件码的组合

168 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

前言

在上一篇的文章中,介绍了条件码以及最常用的几种条件码,指令的执行设置了对应的条件码之后。条件码的各种组合是形成多种条件执行的基础。

条件码的组合

所有的算术和逻辑操作都会设置条件码,每个SET命令的描述都是用的情况是:比如执行比较指令,根据计算表达式t=a-b会设置条件码,a,b,t都是补码形式表示的整数变量,此时以sete作为样例,sete表示“当相等时设置(set when eqaul)”指令。当a=b时,就会得到t=0,因此零标志位ZF为1时,就会得到两个数相等。同样的,假如使用setl指令,表示“当小于时设置(set when less)”,测试一个有符号数比较,当OF为0时,就代表没有发生溢出,当a-b < 0时,就会得到a < b。符号条件码为SF设置为1就表示本次表达式得到了负数,而当a-b >= 0时 a >= b,由此也可以得到SF条件码为0。但是当本次计算表达式发生溢出时,我们有a-b>0发生负溢出时a < b,因为a比b小的多,a-b得到了最大的负数,导致不能w位没办法存储,所以得到了较大正数。同理可得当a-b < 0,发生正溢出,得到a > b。如果a = b时,就不会发生溢出。因此,当OF溢出条件码设置为1时,当且仅当SF被设置为0时,得到a < b。我们将这些情况组合起来,溢出和符号条件码的异或可以验证a < b是否为真的测试。其他的有符号测试比较基于SF ^ OF和ZF的其他组合的。

总结

条件码的各种组合让我们后续的条件循环语句或者时判断语句提供了基础的。