题目如下所示
大致其实就是上面已经给出了算法,我们需要做的就是取得每一次的余数,然后保存起来,可以先压入栈中,因为栈是先进后出的,可以满足我们的需要,因为我们第一次获取的是我们要显示的最后的一个字符
程序如下所示
assume cs:code,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
dw 10 dup(0)
stack ends
code segment
start:
mov ax,12666 ;设置数据
mov bx,data ;设置data段
mov ds,bx ;设置bx
mov bx,stack
mov ss,bx ;设置stack
mov sp,20 ;设置sp
mov si,0
call dtoc ;调用dtoc函数
mov dh,8 ;显示在8行3列
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push ax ;保护寄存器的值
push bx
push si
mov bx,10
s0:
mov dx,0
div bx ;进行16位除法,DX放的是高16位,所以上面要把DX设置位0
add dx,30h ;用余数加30
push dx ;压入每一个字符
mov cx,ax ;将商给cx
inc si
inc cx ;先让cx加1,因为如果cx已经为0了,下面直接到loop的时候CX再去减就变成-1了
loop s0 ;如果cx为0了,就继续执行下一条指令
mov cx,si
mov si,0
s1:
pop ds:[si] ;一个一个的弹出值栈顶从ds:[0]开始给
inc si
loop s1
pop si
pop bx
pop ax
ret
show_str: push cx
push dx
mov bx,0b800h ;设置为显存地址
mov es,bx ;移动到扩展段
mov al,160 ;160个字节一列
sub dh,1 ;第8行开始地址为160*7所以减1
mul dh ;乘7
mov di,ax ;设置di为ax
sub dl,1 ;dl减1就为第二列开始处
mov al,2 ;列中以2个字节为一组数据高地址是字符属性
mul dl ;让al乘dl,结果保存在ax中
add di,ax ;添加列的偏移地址
mov dh,cl ;存放字符的属性
s: mov cl,ds:[si] ;给字符数据给cl
mov ch,0 ;将ch设置为0
jcxz ok ;如果cx为0了,也就是遇到最后一个字符串了就跳出来了
mov dl,cl ;将字符数据给dl
mov es:[di],dx ;设置dx给显存地址区域,dx中包含了字符属性和字符数据
inc si ;字符数据往后偏移
add di,2 ;di加2就是到下一个显存地址处以两个字节为一轮
loop s ;循环
ok:pop dx ;dx寄存器出栈也就是保存的8行和3列数据出栈
pop cx ;cx出栈
ret
code ends
end start
执行结果如下所示