assembly - x86架构是否以特殊方式处理零的二进制减法/与零比较?
问题描述
在再次处理 x86 程序集时,我遇到了一种情况,我试图了解如何解释 cpu 的行为。
当用命令比较两个无符号整数时cmp
,进位和零标志的状态反映了两个整数的关系。因为在没有将减法结果写入最终寄存器的情况下cmp
表现得像命令,所以进位标志占据了借位标志的一部分。sub
此外,减法只不过是反转值的加法。因此,cpu 不是减 1,而是加 -1。
现在,当被减数小于减数时,加法cmp
将导致无进位,但由于需要借位,必须设置进位标志。所以你可以说进位标志必须在加法后反转以获得正确的状态。
前一个假设适用于无符号整数的每种组合,但有一个例外:
从任何无符号整数中减去零与向它们添加零相同,这不会产生进位。因此,反转进位会导致设置进位标志不正确,因为被减数(<0)大于减数(0),这就是为什么不允许设置进位标志,因为不需要借位。
我用一个小汇编程序检查了这种行为,当然,cpu 不会产生设置进位标志。但这只有在 cpu 还检查减数为零(并且被减数不为零,minuend = subtrahend -> 零标志设置)时才有可能。
我的假设是正确的还是我遗漏了什么?
解决方案
你的直觉几乎是正确的。这是缺少的位:减法可以通过补充被减数、传入进位(0 表示sub
,变为 1)和传出进位来实现。当您从某个数字中减去 0 时,添加的是0xffffffff
(假设是 32 位 CPU)和反向进位中的 1。因此,我们实际上添加0x100000000
,设置传出进位(即清除传出借位)。这是您的模型的区别,其中将添加 0,而不是设置传出进位(即设置传出借位),
推荐阅读
- azure - Azure AD Python - 意外的轮询状态 invalid_client 错误
- angular - RXJS 使调用同步
- flutter - 在 Flutter 中有没有办法拥有不同的导航堆栈
- amazon-web-services - 重启在后台运行的 Jupyter Lab 服务器
- python - 光流估计
- powershell - 重复值但具有不同的字符串
- node.js - 将 React 函数式组件转换为 Hook
- reactjs - 未调用 Redux 选择器
- debugging - 如何在版本 > 8 中远程调试附加 Keycloak
- r - 如果从脚本调用并在 R 中的服务器端调用,如何使变量成为全局变量?