Assembly ADC与SBB的结合性

Assembly ADC与SBB的结合性,assembly,x86,x86-64,carryflag,Assembly,X86,X86 64,Carryflag,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

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添加到DEST之上?这很重要,因为如果是这样的话,它会对标志产生不同的影响。

从ADC和SBB执行的操作是基于整个操作的。 如果您将sbb写入为dst-=CF,dst-=src,如果其中任何一个生成借用,则应设置CF

伪代码中的参数并不试图告诉您操作的哪个部分实际设置了标志。你对它读得太多了,要模拟一个带进位和进位的全加adc或sbb并不是那么容易。这就是为什么为它们提供硬件支持的指令非常有用的原因

对于src+CF包装为0的情况,您对sbb的模拟是错误的。您无法区分src=-1cf=1和src=0、CF=0的情况。dst-=0总是产生CF=0。使用调试器在真正的CPU上尝试它

您可以将ADC视为dst+=src+CF或-=对于SBB,其中src+CF临时值是在不截断的情况下计算的;e、 g.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。我更愿意从进位和进位的角度来理解它。或者如果它有帮助的话,比如一个,或者实际上是一个由8、16、32或64个全加器组成的链。当然,物理实现的延迟低于ripple carry


对我来说,计算出令人烦恼的复杂的分支序列,或者在32位固定宽度操作方面模拟adc或sbb所需的任何东西,对于理解它们的功能毫无帮助。它们非常简单,可以看作是原始操作,也很难进行仿真。

从ADC和SBB执行的操作都是基于整个操作的。 如果您将sbb写入为dst-=CF,dst-=src,如果其中任何一个生成借用,则应设置CF

伪代码中的参数并不试图告诉您操作的哪个部分实际设置了标志。你对它读得太多了,要模拟一个带进位和进位的全加adc或sbb并不是那么容易。这就是为什么为它们提供硬件支持的指令非常有用的原因

对于src+CF包装为0的情况,您对sbb的模拟是错误的。您无法区分src=-1cf=1和src=0、CF=0的情况。dst-=0总是产生CF=0。使用调试器在真正的CPU上尝试它

您可以将ADC视为dst+=src+CF或-=对于SBB,其中src+CF临时值是在不截断的情况下计算的;e、 g.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。我更愿意从进位和进位的角度来理解它。或者如果它有帮助的话,比如一个,或者实际上是一个由8、16、32或64个全加器组成的链。当然,物理实现的延迟低于ripple carry


对我来说,计算出令人烦恼的复杂的分支序列,或者在32位固定宽度操作方面模拟adc或sbb所需的任何东西,对于理解它们的功能毫无帮助。它们很简单,可以被认为是基本操作,也很难进行仿真。

因此,仿真ADC至少需要两个加法?@super:That或等效的INC或LEA,以便在基于传入CF进行分支后保留CF,是的。SBB也一样;如果src+1溢出为零,您的模拟可能给出错误的答案。因此,模拟ADC将至少需要两个加法?@super:That或等效的INC或LEA在基于传入CF进行分支后保留CF,是的。SBB也一样;如果src+1溢出为零,则仿真可能给出错误的答案。