鱼C论坛

 找回密码
 立即注册
查看: 2143|回复: 4

[技术交流] [jeset]课程设计1简介版完整程序解释

[复制链接]
发表于 2013-4-16 17:01:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jeset 于 2013-4-16 17:02 编辑

作者:jeset
程序自己编写的,如果有什么可以优化的地方请各位同学前辈指出!
  1. assume cs:code,ds:data,ss:stack

  2. data segment
  3.      db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.      db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.      db '1993','1994','1995'
  6.      ;定义年份完成,byte类型

  7.      dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.      dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  9.      ;定义收入完成,dword类型

  10.      dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  11.      dw 11542,14430,15257,17800
  12.      ;定义21年雇佣人数
  13. data ends

  14. stack segment
  15.          db 1000 dup (0)
  16. stack ends

  17. code segment
  18. ;**************************************************
  19. ;程序开始
  20. ;**************************************************
  21. start:

  22. ;***************************************************
  23. ;初始化段结束
  24. ;***************************************************
  25.          mov ax,data
  26.          mov ds,ax
  27.          mov ax,stack
  28.          mov ss,ax
  29.          mov sp,1000
  30.          mov ax,0b800h    ;把显存地址给es
  31.          mov es,ax
  32. ;***************************************************
  33. ;初始化段开始
  34. ;***************************************************

  35. ;****************************************************
  36. ;年份写入显存段开始
  37. ;****************************************************

  38.          mov cx,21                                                ;设置循环次数
  39.          mov bx,280H                                        ;设置显存行
  40.          mov si,0                                                ;设置源地址
  41.          mov di,2                                                ;设置显存列
  42. nf:
  43.          mov word ptr ax,ds:[si]                ;把源地址给ax 一次性操作一个字,并把19分为:al=1  ah=7,因为一个ascii码占一个内存单元
  44.          mov byte ptr es:[bx+di],al                ;把al低位也就是1给显存的低位
  45.          mov byte ptr es:[bx+di+1],02H        ;把低位的显存属性设置为02H
  46.          mov byte ptr es:[bx+di+2],ah        ;把ah高位也就是9给显存的高位
  47.          mov byte ptr es:[bx+di+3],02H        ;把高位的显存属性设置为02H
  48.          
  49.          mov word ptr ax,ds:[si+2]                ;把源地址给ax 一次性操作一个字,并把75分为:al=7  ah=5,因为一个ascii码占一个内存单元
  50.          mov byte ptr es:[bx+di+4],al        ;把al低位也就是7给显存的低位
  51.          mov byte ptr es:[bx+di+5],02H        ;把低位的显存属性设置为02H
  52.          mov byte ptr es:[bx+di+6],ah        ;把ah高位也就是5给显存的高位
  53.          mov byte ptr es:[bx+di+7],02H        ;把高位的显存属性设置为02H
  54.          add si,4                                                ;源地址+4
  55.          add bx,160                                                ;行号加一行
  56.          loop nf
  57. ;****************************************************
  58. ;年份写入显存段结束
  59. ;****************************************************

  60. ;****************************************************
  61. ;收入写入显存段开始
  62. ;****************************************************
  63.          mov cx,21                                                ;设置循环次数
  64.          mov bx,280H                                        ;设置显存行
  65.          mov di,30                                                ;设置显存列
  66.          mov si,0                                                ;设置源地址
  67. sr:
  68.          mov ax,ds:[si+84]                                ;把低位被除数给ax
  69.          mov dx,ds:[si+84+2]                        ;把高位被除数给dx
  70.          call dtoc                                                ;调用转换程序
  71.          add si,4                                                ;源地址+4,因为收入是dword型数据
  72.          add bx,160                                                ;指向下一行
  73.          mov di,30                                                ;至di为下一行的收入列
  74.          loop sr
  75. ;*****************************************************
  76. ;收入写入显存段结束
  77. ;*****************************************************

  78. ;*****************************************************
  79. ;人数写入显存段开始
  80. ;*****************************************************
  81.          mov cx,21                                                ;设置循环次数
  82.          mov bx,280H                                        ;设置显存行
  83.          mov di,60                                                ;设置显存列
  84.          mov si,0                                                ;设置源地址
  85. rs:
  86.          mov ax,ds:[si+168]                                ;把人数赋值给ax
  87.          mov dx,0                                                ;因为人数为word型所以高位dx至零
  88.          call dtoc                                                ;调用转换程序
  89.          add si,2                                                ;源地址+2,因为人数为word型数据
  90.          add bx,160                                                ;指向下一行显存地址
  91.          mov di,60                                                ;指向下一行显存地址的人数列
  92.          loop rs
  93. ;*****************************************************
  94. ;人数写入显存段结束
  95. ;*****************************************************

  96. ;*****************************************************
  97. ;人均写入显存段开始
  98. ;*****************************************************
  99.          mov cx,21                                                ;设置循环次数
  100.          mov bx,280H                                        ;设置显存行
  101.          mov di,90                                                ;设置显存列
  102.          mov si,0                                                ;设置源地址
  103.          mov bp,0                                                ;设置bp为零,两个用处,一个用处为除数调用偏移地址,一个作为除数
  104. rj:
  105.          push bp                                                ;保存偏移地址bp
  106.          mov ax,ds:[si+84]                                ;收入为dword型,所以低位给ax
  107.          mov dx,ds:[si+84+2]                        ;收入为dword型,所以高位给dx
  108.          mov bp,ds:[bp+168]                                ;把偏移地址bp+168地址的人数赋值给bp
  109.          call divdw                                                ;调用防除法溢出程序进行除法
  110.          call dtoc                                                ;调用转换程序
  111.          pop bp                                                        ;恢复偏移地址bp
  112.          add si,4                                                ;源地址+4
  113.          add bp,2                                                ;偏移地址bp+4
  114.          add bx,160                                                ;指向显存下一行
  115.          mov di,90                                                ;指向显存下一行人均列
  116.          loop rj
  117. ;****************************************************
  118. ;人均写入显存段结束
  119. ;****************************************************
  120.          mov ax,4c00h                                        ;设置中断
  121.          int 21h                                                ;中断程序结束并返回
  122. ;****************************************************
  123. ;程序结束
  124. ;****************************************************

  125. ;****************************************************
  126. ;divdw除法防溢出计算
  127. ;****************************************************
  128. divdw:
  129.          push bx                                                ;保存要用到的寄存器bx
  130.          push ax                                                ;保存低位被除数
  131.          mov ax,dx                                                ;把高位被除数赋值给低位ax
  132.          mov dx,0                                                ;把高位被除数至零
  133.          div bp                                                        ;除以除数,得到高位的商=ax,高位的余数=dx
  134.          mov bx,ax                                                ;把高位的商存放在bx中
  135.          pop ax                                                        ;把低位被除数从栈中弹出到ax,此时dx=高位被除数的余数,ax=低位被除数
  136.          div bp                                                        ;除以除数,dx=余数,ax=商
  137.          mov dx,bx                                                ;把bx高位数商给dx
  138.          pop bx                                                        ;弹出保存的寄存器bx
  139.          ret                                                        ;返回
  140. ;****************************************************
  141. ;divdw除法防溢出计算
  142. ;****************************************************
  143.          
  144. ;****************************************************
  145. ;dtoc转换写入显存程序
  146. ;****************************************************
  147. dtoc:
  148.          push bp                           ;人均运算用到的寄存器
  149.          push cx               ;循环次数进栈
  150.          mov cx,0
  151.          push cx                           ;cx=0进栈,用于检测pop弹出是否完毕
  152. dtoc1:
  153.          push ax                           ;低位被除数进栈
  154.          mov ax,dx                           ;把高位被除数赋值给ax
  155.          mov dx,0                           ;高位置零
  156.          mov cx,10                           ;除数=10
  157.          div cx                                   ;得到高位的商=ax,以及高位余=dx
  158.          mov bp,ax                           ;把高位商存放在bp
  159.          pop ax                                   ;把低位被除数从栈中恢复
  160.          div cx                                   ;除以除数
  161.          add dl,30H                           ;把余数dx中+30H,因为被除数的余数肯定小于除数,所以我直接操作8位寄存器
  162.          push dx                           ;把转换过后的数压栈
  163.          mov dx,bp                           ;把高位被除数的商恢复给dx
  164.          mov cx,ax                           ;把ax商赋值给cx用于检测是否为零
  165.          jcxz dtoc2                           ;cx为零则跳转,不为零向下继续执行
  166.          jmp short dtoc1          
  167. dtoc2:
  168.          pop cx                                   ;从栈中弹出转换过后的ascii数值,一直弹出直到程序开头压栈的cx=0
  169.          jcxz dtocok                   ;检测cx是否为零,不为零进行向下执行,为零则跳转
  170.          mov es:[bx+di],cl           ;因为余数小于除数,所以cx里面只有cl有数值,把转换过后的ascii数值付给显存
  171.          mov byte ptr es:[bx+di+1],02H                         ;在后面设置每个要显示的属性
  172.          add di,2                                ;显存列+2
  173.          jmp short dtoc2               
  174.          
  175. dtocok:
  176.          pop cx                                        ;恢复寄存器
  177.          pop bp                                        ;恢复寄存器
  178.          ret                                        ;返回程序
  179. ;****************************************************
  180. ;dtoc转换写入显存程序
  181. ;****************************************************

  182. code ends
  183. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-16 17:54:03 | 显示全部楼层
强烈支持楼主ing……
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-16 18:45:28 | 显示全部楼层
真是难得给力的帖子啊。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-17 14:30:05 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-17 14:30:54 | 显示全部楼层
Win32 发表于 2013-4-16 18:45
真是难得给力的帖子啊。

谢谢朋友支持!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-12 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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