鱼C论坛

 找回密码
 立即注册
查看: 2502|回复: 5

[技术交流] 课程设计1,单循环,详细注释!

[复制链接]
发表于 2012-8-30 21:30:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 pediyzhi 于 2012-8-30 21:32 编辑

注释多了,复制上来和Editplus格式有点不一样..将就看吧,希望能帮到你

  1. assume cs:code

  2. data segment
  3.         DB        '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
  4.         DB        '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
  5.         DB        '1991', '1992', '1993', '1994', '1995'
  6.                 ;以上是表示21年的21个字符串
  7.                 ;偏移地址是0-53h 十进制是84-1
  8.                 ;每次要+4 用BX来作为寻址reg

  9.         DD        16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
  10.         DD        345980, 590827, 803530, 118300, 184300, 2759000, 3753000, 4649000, 5937000
  11.                 ;以上是表示21年公司总收入的21个dword型数据
  12.                 ;偏移地址从54h-a7h 十进制是84*2=168-1
  13.                 ;每次要+4 用BX来作为寻址reg
  14.         DW        3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
  15.         DW        11542, 14430, 15257, 17800
  16.                 ;以上是表示21年公司雇员人数的21个word型数据
  17.                 ;偏移地址从a8h-d1h 十进制是168+42=210-1
  18.                 ;每次要+2 用SI来作为寻址reg
  19. data ends


  20. Temp segment
  21.         db        8 dup(0)                ;因为最长的数据5937000是7个字符串然后追加一个字节'00'也就是8个
  22. Temp ends

  23.                                        
  24. code segment
  25. start:        mov        ax,data
  26.         mov        es,ax
  27.         mov        ax,temp
  28.         mov        ds,ax
  29.         mov        cx,21
  30.         mov        dh,3                        ;初始化显存行号
  31.                                        
  32. s:
  33. ;---------------------------------------年份----------------------------------------------------
  34. yeah:        push        cx                        ;循环数入栈
  35.         push        es:[bx+0]
  36.         push        es:[bx+2]
  37.         pop        [di+2]
  38.         pop        [di+0]
  39.         mov        [di+4],0                ;末位加0作为字符串结束

  40.                                         ;行已经在DH中表示
  41.         mov        dl,20                        ;列
  42.         mov        cl,2                        ;颜色
  43.         call        show_str                ;赋值后调用显示


  44.                                                                
  45. ;---------------------------------------收入----------------------------------------------------
  46. revenue:push        dx                        ;入栈行数据
  47.         mov        ax,es:[54h+bx+0]
  48.         mov        dx,es:[54h+bx+2]
  49.         call        dtocdd

  50.         pop        dx                        ;出栈行数据

  51.         mov        dl,31                        ;列
  52.         mov        cl,2                        ;颜色
  53.         call        show_str



  54. ;---------------------------------------雇员----------------------------------------------------
  55. employee:
  56.         mov        ax,es:[0a8h+si+0]        ;这里用si作为word型寻址        
  57.         call        dtocdw

  58.         mov        dl,41                        ;列
  59.         mov        cl,2                        ;颜色
  60.         call        show_str        



  61. ;---------------------------------------人均----------------------------------------------------
  62. per:        push        dx                        ;因为下面要进行双字节除法,所以DX(行数据)入栈
  63.         mov        ax,es:[54h+bx+0]
  64.         mov        dx,es:[54h+bx+2]
  65.         div        word ptr es:[0a8h+si+0]
  66.         call        dtocdw
  67.         pop        dx

  68.         mov        dl,51                        ;列
  69.         mov        cl,2                        ;颜色
  70.         call        show_str
  71.         

  72.         pop        cx
  73.         inc        dh                        ;行号递增
  74.         add        bx,4
  75.         add        si,2
  76.         loop        s

  77.         mov        ax,4c00h
  78.         int        21h




  79. ;---------------------------------------显存函数开始--------------------------------------------
  80. show_str:
  81.         push        ax
  82.         push        bx
  83.         push        cx
  84.         push        dx
  85.         push        si
  86.         push        di
  87.         push        es                        ;将data段地址入栈
  88.         xor        di,di
  89.         xor        si,si



  90.         mov        ax,0b800h
  91.         mov        es,ax
  92.         mov        al,80*2                        ;80*2=一行字节数 160=0A0H
  93.         dec        dh                                ;递减指令,同sub al,1 不过占用空间2字节 sub al,1是3字节
  94.         mul        dh                                ;得到行数据
  95.         mov        bx,ax                        ;将积传递给BX
  96.         xor        dh,dh                        ;清除DX高位数据
  97.         add        dl,dl                        ;获得列数据         
  98.         add        bx,dx                        ;获得偏移地址                                ;将偏移地址传递给BX(因为AX不能在寻址中应用)
  99.         mov        ah,cl                        ;将颜色值传递给ah,把cx省下作为比较用,以后第次循环少用一个栈操作                     

  100. display:           
  101.                                         ;将转化后的值出栈,因为高位是0,所以只需要操作低位就可以了
  102.         mov        al,[si]
  103.         mov        cl,al
  104.         xor        ch,ch
  105.         jcxz        show_str_ok
  106.         mov        es:[bx+di],ax                ;AX高位是颜色,低位是颜色值
  107.         add        di,2
  108.         inc        si
  109.         jmp        short display
  110.                   
  111. show_str_ok:        
  112.         pop        es
  113.         pop        di
  114.         pop        si
  115.         pop        dx
  116.         pop        cx
  117.         pop        bx
  118.         pop        ax
  119.         ret
  120. ;---------------------------------------显存函数结束--------------------------------------------


  121. ;---------------------------------------双字除法函数开始--------------------------------------
  122. dtocdd:        push        ax
  123.         push        bx
  124.         push        cx
  125.         push        dx
  126.         push        si
  127.         push        di
  128.         push        es

  129. divdw:        mov        bx,ax                ;bx作为低16位被除数缓存
  130.         mov        ax,dx
  131.         xor        dx,dx
  132.         mov        cx,10                ;除数
  133.         div        cx

  134.         push        ax                ;高16位商入栈

  135.         mov        ax,bx               
  136.         div        cx

  137.         mov        cx,dx                ;余数传递给CX
  138.         pop        dx                ;高16商出栈

  139.         add        cx,30h               

  140.         push        cx
  141.         inc        di                ;作为循环依据
  142.         mov        cx,dx                ;判断
  143.         add        cx,ax               
  144.         jcxz        divdw_ok
  145.         jmp        short divdw

  146. divdw_ok:
  147.         mov        cx,di
  148.         xor        di,di

  149. divdw_s:
  150.         pop        ax
  151.         mov        [di],al
  152.         inc        di
  153.         loop        divdw_s
  154.         mov        byte ptr [di],0
  155.         
  156.         pop        es
  157.         pop        di
  158.         pop        si
  159.         pop        dx
  160.         pop        cx
  161.         pop        bx
  162.         pop        ax

  163.         ret
  164. ;---------------------------------------双字除法函数结束--------------------------------------


  165. ;---------------------------------------普通除法函数开始----------------------------------------
  166. dtocdw:        push        ax
  167.         push        bx
  168.         push        cx
  169.         push        dx
  170.         push        si
  171.         push        di
  172.         push        es

  173. div_Sub:mov        cx,10
  174.         xor        dx,dx
  175.         div        cx
  176.         add        dx,30h
  177.         push        dx
  178.         inc        di
  179.         mov        cx,ax
  180.         jcxz        div_Sub_Ok
  181.         jmp        short        div_Sub        

  182. div_Sub_Ok:
  183.         mov        cx,di
  184.         xor        di,di
  185. div_Sub_Ok_s:
  186.         pop        ax
  187.         mov        [di],al
  188.         inc        di
  189.         loop        div_Sub_Ok_s
  190.         mov        byte ptr [di],0

  191.         pop        es
  192.         pop        di
  193.         pop        si
  194.         pop        dx
  195.         pop        cx
  196.         pop        bx
  197.         pop        ax
  198.         ret

  199.         

  200. ;---------------------------------------普通除法函数结束----------------------------------------



  201. code ends
  202. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-31 00:01:31 | 显示全部楼层
俺来学习,多谢分享经验
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-31 17:38:05 | 显示全部楼层
写的很好~~~俺卡在这了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-10-10 20:55:32 | 显示全部楼层
我也卡这里了。。还没有好的思路。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-11 07:09:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-11 07:49:55 | 显示全部楼层
强力支持楼主  ……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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