当我在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码,但我不确定如何在添加到ASCII后转换ax值。
答案 0 :(得分:12)
你基本上想要除以10,打印余数(一位数),然后用商重复。
; assume number is in eax
mov ecx, 10
loophere:
mov edx, 0
div ecx
; now eax <-- eax/10
; edx <-- eax % 10
; print edx
; this is one digit, which we have to convert to ASCII
; the print routine uses edx and eax, so let's push eax
; onto the stack. we clear edx at the beginning of the
; loop anyway, so we don't care if we much around with it
push eax
; convert dl to ascii
add dl, '0'
mov ah,2 ; 2 is the function number of output char in the DOS Services.
int 21h ; calls DOS Services
; now restore eax
pop eax
; if eax is zero, we can quit
cmp eax, 0
jnz loophere
作为旁注,您的代码中有一个错误:
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.
您将2
放入ah
,然后将ax
放入dl
。在打印之前,你基本上是ax
。
您的大小也不匹配,因为dl
为8位宽,ax
为16位宽。
你应该做的是翻转最后两行并修正尺寸不匹配:
mov ax, 1 ;put 1 into ax
add ax, 2 ; add 2 to ax current value
mov dl, al ; DL takes the value.
mov ah,2 ; 2 is the function number of output char in the DOS Services.
答案 1 :(得分:5)
修正@Nathan Fellman代码的顺序
PrintNumber proc
mov cx, 0
mov bx, 10
@@loophere:
mov dx, 0
div bx ;divide by ten
; now ax <-- ax/10
; dx <-- ax % 10
; print dx
; this is one digit, which we have to convert to ASCII
; the print routine uses dx and ax, so let's push ax
; onto the stack. we clear dx at the beginning of the
; loop anyway, so we don't care if we much around with it
push ax
add dl, '0' ;convert dl to ascii
pop ax ;restore ax
push dx ;digits are in reversed order, must use stack
inc cx ;remember how many digits we pushed to stack
cmp ax, 0 ;if ax is zero, we can quit
jnz @@loophere
;cx is already set
mov ah, 2 ;2 is the function number of output char in the DOS Services.
@@loophere2:
pop dx ;restore digits from last to first
int 21h ;calls DOS Services
loop @@loophere2
ret
PrintNumber endp
答案 2 :(得分:4)
基本算法是:
divide number x by 10, giving quotient q and remainder r
emit r
if q is not zero, set x = q and repeat
请注意,这将产生相反顺序的数字,因此您可能希望将“emit”步骤替换为存储每个数字的内容,以便稍后可以反向迭代存储的数字。 / p>
另外,请注意,要将0到9(十进制)之间的二进制数转换为ascii,只需将“0”(即48)的ascii代码添加到数字中。
答案 3 :(得分:1)
mov dl, ax
这不起作用,因为dl
和ax
具有不同的位大小。你想要做的是创建一个循环,在其中将16位值除以10,记住堆栈上的其余部分,然后使用整数除法结果继续循环。当您得到0的结果时,逐位清理堆栈,将数字加48以将它们转换为ASCII数字,然后打印它们。