Assembly x86体系结构是否以特殊方式处理零的二进制减法/与零的比较?

Assembly x86体系结构是否以特殊方式处理零的二进制减法/与零的比较?,assembly,x86,eflags,Assembly,X86,Eflags,在处理x86汇编时,我再次遇到了一种情况,我试图理解如何解释cpu的行为 当使用cmp命令比较两个无符号整数时,进位和零标志的状态反映了两个整数的关系。由于cmp的行为类似于sub命令,而不将减法结果写入最终寄存器,因此进位标志将作为借用标志的一部分。此外,减法只不过是倒过来的值的加法。因此,cpu不是减去1,而是加-1 现在,当分钟数小于减数时,cmp期间的加法将导致不进位,但由于需要借用,必须设置进位标志。因此,您可以说,在加法后必须反转进位标志才能获得正确的状态。 前一种假设适用于无符号整

在处理x86汇编时,我再次遇到了一种情况,我试图理解如何解释cpu的行为

当使用
cmp
命令比较两个无符号整数时,进位和零标志的状态反映了两个整数的关系。由于
cmp
的行为类似于
sub
命令,而不将减法结果写入最终寄存器,因此进位标志将作为借用标志的一部分。此外,减法只不过是倒过来的值的加法。因此,cpu不是减去1,而是加-1

现在,当分钟数小于减数时,
cmp
期间的加法将导致不进位,但由于需要借用,必须设置进位标志。因此,您可以说,在加法后必须反转进位标志才能获得正确的状态。
前一种假设适用于无符号整数的每个组合,但有一个例外:

从任何无符号整数中减去零与将零相加相同,这不会产生进位。因此,反向进位将导致设置进位标志不正确,因为分钟数(<0)大于减数(0),这就是为什么不允许设置进位标志,因为不需要借用

我用一个小汇编程序检查了这个行为,当然,cpu不会产生一个设置进位标志。但这只有在cpu还检查减数是否为零(并且分钟数不为零,分钟数=减数->零标志集)时才可能实现



我的假设是对的还是我遗漏了什么?

你的直觉几乎是正确的。这里是缺少的位:减法可以通过加法来实现,方法是同时补充进位、进位进位(0表示
sub
,变为1)和进位进位。当从某个数字中减去0时,所加的是
0xffffff
(假设是32位CPU)和反向进位的1。因此,我们实际上添加了
0x100000000
,设置了传出进位(即清除传出借用)。这与您的模型不同,您的模型将添加0,而不是设置外出进位(即设置外出借钱),

您的直觉几乎是正确的。这里是缺少的位:减法可以通过加法来实现,方法是同时补充进位、进位进位(0表示
sub
,变为1)和进位进位。当从某个数字中减去0时,所加的是
0xffffff
(假设是32位CPU)和反向进位的1。因此,我们实际上添加了
0x100000000
,设置了传出进位(即清除传出借用)。这与将添加0的模型不同,不设置传出进位(即设置传出借位),

您假设CPU正在求反和添加。是什么让你认为这是一个有效的假设?@1201程序这就是减法在逻辑中的实现方式。尽管将操作数和进位反转,但它不是一个求和运算。相当于否定,但有细微的区别。(否定本身需要一个加法步骤,那么为什么两个加法就可以做一个减法,而一个加法几乎可以免费完成)@old_timer-为什么CPU不能使用逻辑?你用这个链接回答了自己的问题。x86的减法CF结果是在借用发生时设置的。硬件可以通过多种方式实现这一点。您假设CPU正在进行反运算和加法运算。是什么让你认为这是一个有效的假设?@1201程序这就是减法在逻辑中的实现方式。尽管将操作数和进位反转,但它不是一个求和运算。相当于否定,但有细微的区别。(否定本身需要一个加法步骤,那么为什么两个加法就可以做一个减法,而一个加法几乎可以免费完成)@old_timer-为什么CPU不能使用逻辑?你用这个链接回答了自己的问题。x86的减法CF结果是在借用发生时设置的。硬件可以通过多种方式实现这一点。注意,并不是所有的体系结构都将执行转化为借用。@old_timer确定,但OP特别询问了x86。是的,您的回答是通用的,而不是x86专用的,这意味着它在任何地方都是这样工作的,但事实并非如此,清除混淆时不需要添加混淆。注意,并非所有体系结构都将执行转换为借用。@old_timer确定,但OP特别询问了x86。是的,您的回答是通用的,而不是x86特定的,这意味着它在任何地方都是这样工作的,而事实并非如此。清除混淆时不需要添加混淆。