Assembly 使用MASM在8086中添加两个8位数字

Assembly 使用MASM在8086中添加两个8位数字,assembly,masm,x86-16,microprocessors,emu8086,Assembly,Masm,X86 16,Microprocessors,Emu8086,这是我使用MASM在8086中编写的代码。该代码用于两个8位数字的简单相加(无需担心进位)。我给下面的程序输入了两个数字:31h和16h。输出应该是47小时,但它给我的输出是'w'。如果我取一些不超过9的数字,代码工作正常,有人能在这里指出我的错误吗 代码: 在添加所需的两个常数后,您可以添加al,30h,给您一个值77h。这是w的ASCII代码,然后将其打印为ASCII字符而不是数字。但如果我从代码中删除add al,30h,则不会打印输出。那么我如何打印输出?将结果字节转换为两个十六进制数字

这是我使用MASM在8086中编写的代码。该代码用于两个8位数字的简单相加(无需担心进位)。我给下面的程序输入了两个数字:31h和16h。输出应该是47小时,但它给我的输出是'w'。如果我取一些不超过9的数字,代码工作正常,有人能在这里指出我的错误吗

代码:


在添加所需的两个常数后,您可以添加al,30h,给您一个值
77h
。这是
w
的ASCII代码,然后将其打印为ASCII字符而不是数字。

但如果我从代码中删除
add al,30h
,则不会打印输出。那么我如何打印输出?将结果字节转换为两个十六进制数字。解包BCD算法可能会有所帮助,或者如果有一个库函数可以调用,那么就使用它。您试图做的是将
'0'
的ASCII值添加到字节中。实际上,要将字节分成两个半字节,如果半字节小于10,则添加
'0'
30h
),如果半字节大于或等于10,则添加
'A'-10
37h
)。对两个半字节执行此操作,将获得
'0'
-
'9'
'A'
-
'F'
。但只需添加
30h
仅适用于小于10的数字(
Ah
)。请参阅中的多位数数字常见问题解答。它有一些指向整数->字符串示例的链接。
data segment
   n1 db 31h
   n2 db 16h
data ends

code segment
 assume cs:code, ds:data
  start:

   mov ax,data
   mov ds,ax

   mov al,n1
   mov bl,n2
   add al,bl

   add al,30h
   mov dl,al

   mov ah,02h
   int 21h

   mov ah,4ch
   int 21h

code ends
end start