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

执行结果如下所示
这里写图片描述

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值