我正在编写一个程序,它将帮助理解AAA加法后的结果。
.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)。因此,为了编写实际输出,我们实际上需要将其转换回十六进制数,为此我们取答案的“or”。现在,我们使用“si”和“di”逐个加载数字,并检查是否存在进位,因为当我们执行“aaa”时,我们会知道,因为当数字大于9时,它将生成数字ah,所以我们将通过“inc” al增加一个。请参见下面的“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