鱼C论坛

 找回密码
 立即注册
查看: 1921|回复: 0

[技术交流] 【小甲鱼老师代码】讲一个十进制数字在屏幕上显示

[复制链接]
发表于 2014-4-12 15:44:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
_]`)ZM6$QMTQ_G}8WRXF3.jpg
  1. assume cs:code,ds:data

  2. data segment
  3.         db 10 dup (0)
  4.                
  5. data ends

  6. code segment

  7. start:
  8.         mov ax,12666          ;显示的数据
  9.                
  10.                 ;定位数据存放的段地址
  11.         mov bx,data      
  12.         mov ds,bx
  13.         mov si,0
  14.                
  15.                 ;解析每个字符,将以ascii码存放
  16.         call dtoc         

  17.         mov dh,8          ;初始化打印的位置
  18.         mov dl,3
  19.         mov cl,0cah

  20.         call show_str     ;开始打印字符串

  21.         mov ax,4c00h
  22.         int 21h

  23. dtoc:  ;以下寄存器将要被用到,所以保存以前的值
  24.         push dx
  25.         push cx
  26.         push ax
  27.         push si
  28.         push bx

  29.                 ;bx用来记录个数(例如:  1234 也就是 4 个)
  30.         mov bx,0         
  31.                
  32.                 ;10进制取余  除以10d
  33. s1:     mov cx,10d        
  34.         mov dx,0                  ;清空保存余数的寄存器
  35.                
  36.                 ;刚开始 ax 存放的是 12666
  37.         div cx            
  38.                
  39.                 ;除完之后 ax 又保存商 ,商是作为下一次的被除数,余数保存在dx中
  40.         mov cx,ax        
  41.                
  42.         add dx,30h        ;将余数加上30h得到相应的ASCII码
  43.         push dx                          ;将每个数字保存起来
  44.         inc bx                          ;记录存放的次数 +1

  45.                 ;如果商为 0 的话,就不需要在进行除法运算了 ,刚才把ax商,保存在cx中,就是因为 jcxz 只判断cx 的值是否为0
  46.         jcxz s2   
  47.                
  48.         jmp short s1          ;返回到 s1 标号处,继续循环

  49.                
  50. s2:     
  51.         mov cx,bx        ;总共有bx位进栈了,所以循环次数为bx
  52.         mov si,0
  53.                
  54. s3:     pop ax           ;s3实现将栈中的数据依次出栈放到指定内存中

  55.         mov [si],al                 ;因为余数8位存放的是8位,所以存放在al中
  56.         inc si                         ;定位下一个存放的位置

  57.         loop s3

  58.                 ;还原以前的值
  59. okay:   pop bx        
  60.         pop si
  61.         pop ax
  62.         pop cx
  63.         pop dx

  64.         ret   ;数值显示的子程序定义结束



  65. show_str:  ;显示字符串的子程序已经在第一题中说明,在此不再赘述。

  66.         push bx
  67.         push cx
  68.         push si

  69.                 ;行偏移
  70.         mov al,0A0h
  71.         dec dh
  72.         mul dh
  73.                
  74.                 ;列偏移
  75.         mov bx,ax
  76.         mov al,2
  77.         mul dl
  78.                
  79.                 ;列偏移加上行偏移
  80.         sub ax,2
  81.         add bx,ax
  82.                
  83.                 ;显存段地址
  84.         mov ax,0B800h
  85.         mov es,ax
  86.                
  87.         mov di,0
  88.         mov al,cl        ;颜色
  89.         mov ch,0

  90.                 ;注意  假如数字是 1234 ,前面我们入栈出栈 在1234 存入到内存的时候, 1的偏移地址是0 ,2的偏移地址是1 一次类推(这就由前面的入栈出栈导致的)
  91. s:      mov cl,ds:[si]

  92.         jcxz ok        ;我们将 1234 (假如是1234) 解析每个数字,以ascii码 存放到内存的时候,我们并没有 给他一个结尾的标志0 ,那为什么我们可以通过jcxz 来判断数字是否结束?
  93.                                 ;刚才我实验了一下,我们不需要在最后加0 他好像自动回添加 ,或者说我实验的时候,刚好1234 后面一个字节 的数字是0

  94.         mov es:[bx+di],cl        ;显示每个数字
  95.         mov es:[bx+di+1],al ;指定每个数字的属性
  96.                
  97.         inc si                                ;定位下一字符数据的位置
  98.         add di,2                        ;定位下一字符数据要显示的位置

  99.         jmp short s

  100. ok:     pop si
  101.         pop cx
  102.         pop bx
  103.                
  104.         ret

  105. code ends

  106. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-28 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表