当我在16位汇编中将两个值相加时,将结果打印到控制台的最佳方式是什么?
目前我有这个代码:
;;---CODE START---;;
mov ax, 1 ;put 1 into ax
add ax, 2 ; add 2 to ax current value
mov ah,2 ; 2 is the function number of output char in the DOS Services.
mov dl, ax ; DL takes the value.
int 21h ; calls DOS Services
mov ah,4Ch ; 4Ch is the function number for exit program in DOS Services.
int 21h ; function 4Ch doesn't care about anything in the registers.
;;---CODE END---;;
我认为dl值应该是ASCII码,但是我不确定如何将相加后的ax值转换成ASCII码。
5条答案
按热度按时间ryoqjall1#
基本上,您需要除以10,打印余数(一位数),然后重复计算商。
顺便说一句,您的代码中有一个bug:
你把
2
放进ah
,然后把ax
放进dl
,你基本上是在打印之前丢弃ax
。由于
dl
为8位宽,而ax
为16位宽,因此还存在大小不匹配的问题。您应该做的是翻转最后两行并修复大小不匹配:
lx0bsm1f2#
我只是在修改“内森·费尔曼的代码”的顺序
zfciruhq3#
基本算法为:
注意,这将以相反的顺序产生数字,因此您可能希望用存储每个数字的内容来替换“emit”步骤,以便稍后可以反向迭代存储的数字。
另外,请注意,要将0到9(十进制)之间的二进制数转换为ascii,只需将“0”的ascii代码(即48)添加到该数字即可。
ej83mcc04#
由于
dl
和ax
的位数不同,因此这是行不通的。您需要创建一个循环,将16位值除以10,记住堆栈中的其余部分,然后使用整数除法结果继续循环。当结果为0时,逐位清除堆栈,将数字加上48以将其转换为ASCII数字。然后打印出来。wlsrxk515#
您的代码
总是在
int 21h
指令之前加载指令中的DOS函数编号。始终检查您的尺寸:不能从16位寄存器移动到8位寄存器。
我认为
dl
值应该是ASCII码,但我不知道如何将相加后的ax
值转换为ASCII码。您的数字允许使用DOS.PrintCharacter函数。要将值3转换为字符“3”,您只需要加上48,以便在DL中具有ASCII代码。
当我在16位汇编中将两个值相加时,将结果打印到控制台的最佳方法是什么?
一位数结果的示例
多位结果的解决方案
NASM使用
mov bx, Buffer + 5
MASM使用
mov bx, OFFSET Buffer + 5