我写了一个程序来帮助理解 AAA After Addition。
.model small
.data
a db '1234'
len1 db $-a
b db '9876'
len2 db $-b
result db 05 dup(?)
len3 db $-result
.code
main proc near
mov ax,@data
mov ds,ax
lea bx,a
add bl,len1
mov si,bx
lea bx,b
add bl,len2
mov di,bx
dec si
dec di
dec len3
lea bx,result
add bl,len3
mov cl,len1
mov ax,0h
l1:
mov al,[si]
mov dl,[di]
cmp ah,00h
je skip
mov ah,0h
inc al
skip:
add al,dl
aaa
or al,30h
mov [bx],al
dec bx
dec si
dec di
loop l1
cmp ah,00h
je over
mov [bx],31h
jmp finish
over:
mov [bx],30h
finish:
mov ax,04ch
int 21h
endp
end
现在正如您在“add”指令之后的程序中看到的那样,我们使用“aaa”将数字转换为 ASCII(30-39 对应于 0-9)。所以写出真正的输出,我们实际上需要将它恢复为十六进制,因为我们正在接受答案的“或”。现在使用“si”和“di”,我们将一个一个地加载数字并检查是否有进位,当我们执行“aaa”时我们会知道,因为当 digit 大于 9 时它将生成 digit ah,所以我们将“inc一个接一个。看看下面的“aaa”是如何工作的。
AAA (ASCII Adjust after Addition)
if low nibble of AL > 9 or AF = 1 then:
AL = AL + 6
AH = AH + 1
AF = 1
CF = 1
else
AF = 0
CF = 0
in both cases:
clear the high nibble of AL.
有关更多与 ASCII 加法、减法、乘法和除法相关的程序,请查看此链接。GitHub