鱼C论坛

 找回密码
 立即注册
查看: 1882|回复: 3

053视频,小甲鱼代码有点疑惑(数值显示的代码)

[复制链接]
发表于 2013-4-21 22:24:49 | 显示全部楼层 |阅读模式

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

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

x
  1. assume cs:code,ds:data

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

  5. code segment
  6. start:
  7.                 mov ax,12666                ;需要处理的字符
  8.                
  9.                 mov bx,data                        ;ds:si指向字符串的首地址
  10.                 mov ds,bx
  11.                 mov si,0
  12.                
  13.                 call dtoc                        ;dtoc子程序实现将word型整数转化为字符串并存储
  14.                
  15.                 mov dh,8                        ;初始化打印(显示)的位置
  16.                 mov dl,3
  17.                 mov cl,0cah
  18.                
  19.                 call show_str                ;开始打印字符串
  20.                
  21.                 mov ax,4c00h
  22.                 int 21h
  23.                
  24. dtoc:                ;数值显示的子程序定义
  25.                 push dx
  26.                 push cx
  27.                 push ax
  28.                 push si
  29.                 push bx
  30.                
  31.                 mov bx,0                        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  32.                
  33. s1:                mov cx,10d                        ;d表示10进制(除数)
  34.                 mov dx,0
  35.                
  36.                 div cx                                ;除以10
  37.                 mov cx,ax                        ;得到的商赋值给cx
  38.                
  39.                 jcxz s2                                ;当商为0的时候跳到s2(cx用来判断)已经到了个位(余数是个位)
  40.                
  41.                 add dx,30h                        ;将余数加上20h得到相应的ASCLL码
  42.                 push dx                                ;将数据存放入栈
  43.                
  44.                 inc bx                                ;bx记录栈存放了多少位数
  45.                
  46.                 jmp short s1
  47.                
  48. s2:                add dx,30h                        ;当商为0的时候,余数为个位
  49.                 push dx                               
  50.                 inc bx                                ;再进行一次栈操作(补充当“商为0而余数不为0时的情况”)
  51.                
  52.                 mov cx,bx                        ;总共有bx位进栈了,所以循环次数为bx
  53.                 mov si,0
  54.        
  55. s3:                pop ax                                ;s3实现将栈中的数据一次出栈放到指定内存中

  56.                 mov [si],al
  57.                 inc si
  58.                
  59.                 loop s3
  60.                
  61. okay:        pop bx
  62.                 pop si
  63.                 pop ax
  64.                 pop cx
  65.                 pop dx
  66.                
  67.                 ret                                        ;数值显示的子程序定义结束

  68.                
  69. show_str:
  70.                 push cx
  71.                 push si
  72.                
  73.                 mov al,0a0h                        ;每行有多少个字节(160)
  74.                
  75.                 dec dh                                ;行号从下标0开始,所以减1
  76.                 mul dh                                ;相当于从第(n-1)* 0a0h个byte单元开始
  77.                                                         ;乘法之后默认放在ax中
  78.                 mov bx,ax                        ;定位好的位置偏移地址存放在bx里(行)
  79.                
  80.                 mov al,2                        ;每个字符占两个字节
  81.                 mul dl                                ;定位列,结果ax存放的是定位好的列的位置
  82.                 sub ax,2                        ;列号在显存中下标从0开始,偶字节存放字符,所以减2
  83.                
  84.                 add bx,ax                        ;此时bx中存放的是行与列号的偏移地址(行的偏移地址加上列的偏移地址)
  85.                
  86.                 mov ax,0b800h                ;显存开始的地址
  87.                 mov es,ax                        ;es中存放的是显存的第0页(共0~7页)的起始的段地址
  88.                
  89.                 mov di,0                        ;di指向显存的偏移地址,确定指向下一个要处理的字符的位置
  90.                
  91.                 mov al,cl                        ;cl是存放颜色的参数,这时候al存放颜色了
  92.                                                         ;因为下边cl要用来陇南市存放要处理的字符(判断跳转指令通过cx确定)
  93.                 mov ch,0                        ;下边cx存放的是每次准备处理的字符
  94.                
  95.         s:        mov cl,ds:[si]                ;ds:[si]指向“Welcome 头 masm!”,0
  96.        
  97.                 jcxz ok                                ;当cl的值为0的时候,cx==0,则发生跳转,到0k处结束处理
  98.                
  99.                 mov es:[bx+di],cl        ;偶地址存放字符
  100.                 mov es:[bx+di+1],al        ;奇地址存放字符的颜色属性
  101.                
  102.                 inc si                                ;指向下一个字符(源字符串)
  103.                
  104.                 add di,2                        ;指向下一个字符(目的字符串)
  105.                 jmp short s                        ;无条件跳转,jcxz是离开的关键跳
  106.                
  107.         ok:        pop si
  108.                 pop cx
  109.                
  110.                 ret                                        ;显示字符串的子程序【定义结束】
  111.                
  112. code ends
  113. end start       
  114.                
复制代码
感觉s2这个标记后面没必要,s1和s2进行的都是同一个操作,,为什么要分两个?应该可以合成一个循环中,不知道我的想法对不对??
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-21 22:36:22 | 显示全部楼层
帮楼主顶一下!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-21 23:53:28 | 显示全部楼层
这个问题你可以按照自己的想法去把源码改一下试验一下吗。只要能够完成源程序的需求就可行啊。至于为什么分开成s2,s1两部分代码,也有它的道理,如果不分开的话,只有s1的话,那么程序将会陷入死循环(原因jump short s1)。不过s1,s2代码是可以合并的,自己可以去多做实验
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-22 09:58:35 | 显示全部楼层

嗯,我试试.......
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 18:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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