繁体   English   中英

为什么零旗存在?

[英]Why does the Zero Flag exist?

我知道在算术中使用进位和溢出标志进行错误检查,但为什么零标志对系统/程序员有用?

对于任何计算机来说,一个极其常见的任务是比较两个整数(或指针)的大于/小于/相等,并根据结果有条件地跳转。 这就是您如何实现更高级别的构造,例如if (x < y)if (x == y)等等。

在 x86 上,与许多其他架构一样,此任务分为两条指令: CMP或一些类似的指令来执行比较的算术,以及条件Jcc指令来执行跳转。 CPU 中必须有某种 state 以便CMP传达其结果供Jcc使用,这就是FLAGS寄存器的用途。

相等性测试是其中最基本的,因此应该有一个标志,根据CMP的两个操作数是否相等来设置标志。 由于CMP实际上是一个减法运算,这相当于询问减法的结果是否为零,这很容易在硬件中通过将所有位相或并将一位结果取反来完成。 这就是零标志。 由于它基本上没有成本,8086 设计者决定在几乎每条算术或逻辑指令之后以这种方式设置零标志,而不仅仅是CMP

那么“如果相等则跳转”等价于“如果设置了零标志则跳转”。 实际上, JEJZ只是同一机器代码指令的不同汇编助记符。

其他标准算术标志(进位、符号、溢出)也以这种方式使用。 到目前为止,这比任何类型的错误检查都更常见。 (事实上,许多编译语言没有这样的错误检查,如果发生溢出则简单地忽略它。)例如,如果你想在AX < BX时跳转,其中寄存器中的值将被视为无符号,你可以减去 BX如果发生借位,则从 AX 跳转,在 x86 上设置进位标志。 然后您的代码看起来就像CMP AX, BX / JC label 汇编器允许您使用JB而不是JC ,以便您可以将其视为“如果低于则跳转”。 您也可以将它与零标志结合使用; 如果你想跳转 if AX <= BX ,那么你写CMP AX, BX; JBE label CMP AX, BX; JBE label ,如果设置了进位标志零标志, JBE将跳转。

符号和溢出标志类似地用于有符号比较,尽管规则稍微复杂一些。

这些标志比仅仅从 CMP 出来的有用得多。 想像这样的代码:“if(.--x) {...}”

这可以通过 DEC/JZ 对轻松实现,无需任何干预 CMP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM