前言
近日学习汇编,发现当想要以十进制形式输出一个寄存器中所存放的数值时,是比较麻烦的,没有一个特别好的方法。因此,我尝试通过子程序的方法,编写一个十进制输出小程序来解决这个问题
一、算法概述
要输出一个十进制数,最有可能想到的就是通过不断用数据除10,然后获取余数来输出这个数据。基于此思想,我尝试通过汇编中div的特性,即当div除以十六位数据时,DX存放余数,AX存放商的性质来获取余数,然后不断往复,直到AX中商为0,同时DX中余数也为0时停止获取,然后一并输出。
显然,这里存在一个问题,即数据是以从个位到最高位的顺序产生的,想要解决这个输出问题,可以借助堆栈的思想,利用堆栈先进后出的特性,来先输出最高位,然后次之。同时,对于何时停止输出堆栈数据,可以在算法开始前,先push一个标志,0~9之外的标志都可以,当检测到标志时,停止输出。
入口参数:ax,存放想要输出的数据
二、完整代码
代码如下(示例):
.model small
.stack
.data
.code
.startup
mov ax,9321
call todec
.exit
todec proc
push bx
push si
push dx
mov bx,0DH ;一个判断是否还要继续输出的标志,除了0~9都可以
push bx
again:
xor dx,dx
mov si,10
div si ;余数放dx,商放ax
cmp dx,0
jne next ;余数不等于0,直接转到余数入栈操作
cmp ax,0 ;余数等于0,看看商等不等于0
je print ;商也等于0,开始打印输出
next:
or dl,30h
push dx ;变成0~9对应的ASCII入栈
jmp again
print:
pop dx
cmp dx,0Dh ;如果是放入的标志,停止输出
je over
mov ah,2 ;不是的话就输出
int 21h
jmp print
over:
pop dx
pop si
pop bx
ret
todec endp
end