8086汇编将数值显示在屏幕

题目如下所示

大致其实就是上面已经给出了算法,我们需要做的就是取得每一次的余数,然后保存起来,可以先压入栈中,因为栈是先进后出的,可以满足我们的需要,因为我们第一次获取的是我们要显示的最后的一个字符

程序如下所示

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

执行结果如下所示