嘿!我有一个关于汇编语言的问题。该指令adc eax, ebx
将寄存器eax
、寄存器ebx
和进位标志的内容相加,然后将结果存储回eax
。我的问题是假设adc
指令是不允许的,那么我们如何编写产生与adc eax, ebx
.
我在下面写了一些代码,但可能不正确。
add eax, ebx
add eax, 1
您需要做的是使用条件跳转来处理进位标志。可能有几种方法可以解决这个问题。这是我的方法:
push ebx ; We want to preserve ebx. This seems lazy but it's
; an easy approach.
jnc carry_handled ; If the carry is set:
add ebx, 1 ; Add 1 to summand. We are using
; ADD here, because INC does not
; set the carry flag.
;
jz carry_overflowed ; If it overflows (ebx is 0), then
; skip the addition. We don't want
; to add 0 which will clear the
; carry flag.
carry_handled: ;
add eax, ebx ; Add the adjusted summand.
carry_overflowed:
pop ebx
需要注意的重要一点是,您希望正确设置 CPU 标志,就像adc
执行 an 一样。在上述方法中,jz carry_overflowed
如果您事后不关心进位标志,则多余。