ADC
的操作为DEST ← DEST + SRC + CF
,SBB
的操作为DEST ← (DEST – (SRC + CF))
。让我感到困惑的是这些说明对国旗的影响。在SBB
的情况下,关联性是明确的,因此我将假设SBB
等效于(就最后的寄存器状态而言)]
jnc label
lea src, [src+1]
sub dest, src
lea src, [src-1]
jmp label2
label:
sub dest, src
label2:
但是,在ADC
的情况下,是否会先将SRC
添加到DEST
,然后再添加CF
?这很重要,因为如果这样,它将对标志产生不同的影响。
ADC和SBB的进货基于整个操作。如果将sbb
写为dst -= CF
,dst -= src
,如果其中的任一产生借位,则应该设置CF。
伪代码中的括号不是试图告诉您操作的哪一部分实际设置了FLAGS。您对它的阅读太多了,要模拟一个全加器并不是一件容易的事(adc
或sbb
带有随身携带和随身携带的功能。这就是为什么为其提供硬件支持的指令超级有帮助的原因。)] >
对于sbb
环绕为0的情况,您对src+CF
的仿真是错误的。
[您可以将ADC视为dst += src + CF
(或SBB为-=
),其中src+CF
临时值不被截断;例如对于32位操作数大小,为33位总和。 ADD / SUB / ADC / SBB的dst
和CF输出也可以视为33位值。
简单示例:
mov al, 0xFF ; AL=0xFF stc ; CF=1 adc al, 0xFF ; CF:AL = AL + (0xFF+CF) = AL + 0x100 ; AL = 0xFF, CF=1
模拟
adc
十分复杂,仅从进位和从加法进位方面理解IMO,对IMO更有帮助。或者,如果有帮助,例如full adder,或者实际上是8、16、32或64个全加法器链。 (当然,物理实现的延迟要比纹波传递的延迟低)。
对我来说,计算出烦人的复杂分支顺序或用32位固定宽度运算来模拟adc
或sbb
所需的任何内容,对于理解它们的作用将为零。它们足够简单,可以认为是原始操作,而很难模拟。