ADC和SBB的关联性

问题描述 投票:1回答:1

ADC的操作为DEST ← DEST + SRC + CFSBB的操作为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?这很重要,因为如果这样,它将对标志产生不同的影响。

assembly x86 x86-64 carryflag
1个回答
3
投票

ADC和SBB的进货基于整个操作。如果将sbb写为dst -= CFdst -= src,如果其中的任一产生借位,则应该设置CF。

伪代码中的括号不是试图告诉您操作的哪一部分实际设置了FLAGS。您对它的阅读太多了,要模拟一个全加器并不是一件容易的事(adcsbb带有随身携带和随身携带的功能。这就是为什么为其提供硬件支持的指令超级有帮助的原因。)] >

对于sbb环绕为0的情况,您对src+CF的仿真是错误的。

您无法将src = -1 CF = 1的情况(始终带进来)与src = 0,CF = 0。 (dst- = 0总是产生CF = 0)。使用调试器在真实的CPU上尝试。

[您可以将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位固定宽度运算来模拟adcsbb所需的任何内容,对于理解它们的作用将为零。它们足够简单,可以认为是原始操作,而很难模拟。

© www.soinside.com 2019 - 2024. All rights reserved.