Assembly 如何在汇编中使用ADC?

Assembly 如何在汇编中使用ADC?,assembly,x86,Assembly,X86,上面是我在汇编中添加两个两位数的代码。我想知道ADC为什么不工作。如果添加的数字没有进位,则我的代码有效。但并非如此。我是否误解了ADC的真正功能?我应该如何处理我的代码?在这里查看这个问题,答案解释了ADC-Add与进位的工作原理。基本上,首先需要使用普通的add指令将低阶字节相加。然后使用ADC(带进位的add)将高阶字节相加,如果低阶字节add生成进位,ADC将添加进位 例如,如果要添加AX和BX,请执行以下操作: .MODEL SMALL .STACK 1000 .DATA MSGA

上面是我在汇编中添加两个两位数的代码。我想知道ADC为什么不工作。如果添加的数字没有进位,则我的代码有效。但并非如此。我是否误解了ADC的真正功能?我应该如何处理我的代码?

在这里查看这个问题,答案解释了ADC-Add与进位的工作原理。基本上,首先需要使用普通的add指令将低阶字节相加。然后使用ADC(带进位的add)将高阶字节相加,如果低阶字节add生成进位,ADC将添加进位

例如,如果要添加AX和BX,请执行以下操作:

.MODEL SMALL
.STACK 1000
.DATA

MSGA DB 13,10,"Input first number: ","$"
MSGB DB 13,10,"Input second number:","$"
MSGC DB 13,10,"The sum is: ","$"

NUM1 db ?
NUM2 db ?
NUM3 db ?

.CODE

MAIN PROC NEAR

MOV AX, @DATA
MOV DS, AX

; get first number
LEA DX, MSGA
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV BL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV CL, AL

; get second number
LEA DX, MSGB
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DH, AL

; add
ADD CL, DH 
ADC BL, DL
MOV NUM1, CL
ADD NUM1, '0'
MOV NUM2, BL
ADD NUM2, '0'

; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h

MOV DL, NUM2
MOV AH, 02H
INT 21h

MOV DL, NUM1
MOV AH, 02H
INT 21h

MOV AH, 4Ch
INT 21h

MAIN ENDP
END MAIN
正如对您的问题的评论所提到的,您实际上是在执行十进制算术,即获取每个ASCII字符,然后从中减去“0”。这些操作中的每一个都只会生成一个存储在8位寄存器中的0到9之间的二进制数。正如评论所说,将两个小于10的数字相加永远不会产生进位,而进位只能在结果大于256时发生

如果继续使用执行此任务的方法,则需要手动检查两个低阶十进制数字的加法是否导致进位,方法是检查加法的结果是否大于10,以及是否从数字中减去10,然后在高阶数字计算中加1

这有意义吗


这是家庭作业吗?如果是,作业的目的是学习进位法的工作原理,还是仅仅编写一个程序将两个两位数相加

您似乎在使用十进制数学,但没有使用
AAA
ADC
实现了您所期望的功能,但是使用该代码,从第一次加法开始就没有实际进位(毕竟,9+9不大于255)

因此,解决方案当然是使用
AAA
,如下所示(未经测试):

AAA
()测试
al
是否大于9,如果大于9:

  • 调整
    al
  • 设置进位标志,然后
  • 增量
    ah

ADC
在这里真的没有用,因为添加2位数字永远不会得到一个字节无法修复的结果。我的意思是“适合”而不是“修复”。对不起,请看我的代码,我有两行代码与该示例相同。请查看@harold发布的答案。他的解决方案更好,因为它使用一个名为的指令来完成您需要做的事情,并且还使用进位标志来完成您需要做的事情。我只想编写一个添加两位数的程序。对不起,我是汇编新手。aaa和xchg实际上做什么?@JRIT交换(交换)了两个things@jrmeasures事实证明,它的作用与我记忆中的不同,所以我编辑了我的答案。我真的需要使用al、dl、ah和dh吗?@JR如果你真的需要使用
al
ah
,你可以将
d
更改为你喜欢的
add  al, bl
adc  ah, bh   ; include the carry if previous add generated one
add al,dl
aaa        ; takes no arguments and works on al
add ah,dh  ; adc not necessary, aaa already incremented ah if there was a carry