在汇编语言中执行 "add" 和 "carry" 操作的替代方法是什么?
What is the alternate way of doing "add" and "carry" operation in Assembly Language?
喂!我有一个关于汇编语言的问题。
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
一样。在上述方法中,如果您之后不关心进位标志,则 jz carry_overflowed
是多余的。
喂!我有一个关于汇编语言的问题。
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
一样。在上述方法中,如果您之后不关心进位标志,则 jz carry_overflowed
是多余的。