鱼C论坛

 找回密码
 立即注册
查看: 3150|回复: 1

[技术交流] 《课程设计1》注释比代码还多的家伙

[复制链接]
发表于 2011-7-10 15:54:15 | 显示全部楼层 |阅读模式

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

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

x
  1. ;方案一: 根据实验7,先将数据按照规定格式存储,然后在显示的时候再将数据转化为字符串显示出来;
  2. ;方案二:根据实验7,先将数据按照一定的格式并转化为字符串进行存储,然后在显示的时候直接显示出来;

  3. ;以下用的是用的是方案一作为设计方案:
  4. assume cs:code,ds:data

  5. ;源数据段
  6. data segment

  7.         db '1975','1976','1977','1978','1979','1980','1981'
  8.         db '1982','1983','1984','1985','1986','1987','1988'
  9.         db '1989','1990','1991','1992','1993','1994','1995'
  10.         ;以上是表示21年的21个字符串。共84个字节,起始单元:0

  11.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  12.         dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  13.         ;以上是表示21年公司总收入的21个dword型数据。共84个字节,起始单元:84

  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型数据。共42个字节,起始单元:168

  17. data ends

  18. ;经转化后的目标数据段
  19. table segment
  20.         db 21 dup ('year summ ne ?? ')
  21. table ends

  22. ;用于存储字符属性,并作为栈空间使用的段
  23. rgb segment

  24.         db 00000010b;0、黑底绿字
  25.         db 01000010b;1、红底绿字
  26.         db 01110001b;2、白底蓝字
  27.         db 00100100b;3、绿底红字
  28.         db 11000010b;4、红底闪烁绿字
  29.         db 01001010b;5、红底高亮绿字
  30.         db 00000111b;6、黑底白字

  31.         db 48 dup (0)    ;真正作用于栈段的内存空间
  32. rgb ends

  33. ;用于存储显示到DOS的临时字符串的数据段
  34. form segment
  35.         db 10 dup(20h)
  36. form ends

  37. code segment
  38. start:       
  39.                 mov ax,rgb
  40.                 mov ss,ax
  41.                 mov sp,40h
  42.                
  43.                 call init                                ;初始化公司数据
  44.                
  45.                
  46.                
  47.                 mov bp,6                                        ;设置字体颜色编号
  48.                 mov dh,2                                        ;设置初始行号(共25行,0~24)               

  49.                 mov di,0                                        ;table的行偏移
  50.                
  51.                 mov cx,21
  52. Lp:               
  53.                 push cx                                        ;当前循环
  54.                 mov dl,19                                        ;设置初始列号(共80列,0~79)
  55.                
  56.                 mov si,0                                        ;0年份
  57.                 add si,di
  58.                
  59.                 mov cx,0                                        ;设置除数为0,表示当前数据为字符串;否则为数字
  60.                
  61.                 call setForm
  62.                 call show_str
  63.                
  64.                 mov si,5                                        ;5总收入?
  65.                 add si,di
  66.                
  67.                 mov cx,1                                        ;设置除数为0,表示当前数据为字符串;否则为数字
  68.                 mov bx,0                                        ;bx=0,表示被除数为dword型;否则表示被除数为word型
  69.                
  70.                 call setForm
  71.                 call show_str
  72.                
  73.                 mov si,10                                        ;10雇员人数
  74.                 add si,di
  75.                
  76.                 mov cx,1                                        ;设置除数为0,表示当前数据为字符串;否则为数字
  77.                 mov bx,1                                        ;bx=0,表示被除数为dword型;否则表示被除数为word型
  78.                
  79.                 call setForm
  80.                 call show_str
  81.                
  82.                 mov si,13                                        ;13人均收入
  83.                 add si,di
  84.                
  85.                 mov cx,1                                        ;设置除数为0,表示当前数据为字符串;否则为数字
  86.                 mov bx,1                                        ;bx=0,表示被除数为dword型;否则表示被除数为word型
  87.                
  88.                 call setForm
  89.                 call show_str
  90.                
  91.                
  92.                 inc dh                                                ;下一行数据
  93.                 add di,16
  94.                 pop cx
  95.                 loop Lp
  96.                
  97.                
  98.                 mov ax,4c00h
  99.                 int 21h

  100. ;将数据转化为字符串,并存储到临时数据段               
  101. setForm:
  102.                 push dx                                        ;保存DOS显示时的行和列
  103.                 push di
  104.                
  105.                
  106.                 mov ax,table
  107.                 mov ds,ax
  108.                 mov ax,form
  109.                 mov es,ax

  110.                 mov di,0
  111.                 mov ax,[si]                                ;dword型数据的低16位
  112.                 mov dx,2[si]                                ;dword型数据的高16位
  113.                 jcxz year
  114.                
  115.                 mov cx,bx                                        ;bx=0,表示被除数为dword型;否则表示被除数为word型
  116.                 jcxz isDword
  117.                 mov dx,0
  118. isDword:       
  119.                 call dtoc
  120.                 jmp short R_sf
  121.                
  122.                 ;复制到格式数据段
  123. year:        mov es:[di],ax
  124.                 mov es:2[di],dx
  125.                 mov byte ptr es:4[di],0
  126.                
  127. R_sf:       
  128.                 pop di
  129.                 pop dx
  130. ret

  131. ;将数字转化为字符串
  132. dtoc:
  133.                 mov di,0                                        ;记录转化的字符个数
  134. Jp_dtoc:
  135.                 mov cx,10                                        ;设置除数为10
  136.                 call divdw
  137.                
  138.                 add bl,30h
  139.                 push bx                                        ;保存余数
  140.                 inc di
  141.                
  142.                 mov cx,dx                                        ;判断高16位是否为0
  143.                 jcxz Jz_ax       
  144.                 jmp short Jp_dtoc
  145.                
  146. Jz_ax:        mov cx,ax                                        ;判断低16位是否为0
  147.                 jcxz Jz_dtOk
  148.                 jmp short Jp_dtoc
  149.                
  150. Jz_dtOk:
  151.                 mov cx,di
  152.                 mov di,0
  153. Lp_dt:        pop es:[di]                                ;将已转化的数据重新排列到存储临时字符串的数据段
  154.                 inc di
  155.                 loop Lp_dt
  156.                 mov byte ptr es:[di],0        ;设置结束标记
  157. ret

  158. ;ax(dword型数据的低16位);dx(dword型数据的高16位);cx(除数);bx(余数)
  159. divdw:        mov bx,ax                        ;BX未计算的低16位
  160.                 mov ax,dx
  161.                 mov dx,0                        ;由于忘记清0,所以结果老是不对
  162.                 div cx
  163.                
  164.                 mov si,ax                        ;SI已计算的高16位
  165.                 mov ax,bx
  166.                 div cx                                ;AX即是商,也是已计算的低16位
  167.                
  168.                 mov bx,dx                        ;设置余数
  169.                 mov dx,si                        ;设置高16位
  170.                
  171.                 ret

  172. ;初始化公司的信息数据,并按要求存储到Table段中
  173. init:               
  174.                 ;设置数据段和附加段
  175.                 mov ax,data
  176.                 mov ds,ax
  177.                 mov ax,table
  178.                 mov es,ax
  179.                
  180.                 mov bx,0                                ;设置年份和总收入的偏移地址
  181.                 mov si,0                                ;设置雇员人数的偏移地址
  182.                 mov di,0                                ;设置目标数据段的偏移地址
  183.                 mov cx,21                                ;设置循环次数,共有21条数据
  184.                
  185.                 ;从数据段中复制年份到目标数据段中
  186. Lp_i:        mov ax,[bx]                        ;年份的前两个字节
  187.                 mov es:[di],ax
  188.                 mov ax,2[bx]                        ;年份的后两个字节
  189.                 mov es:2[di],ax
  190.                
  191.                 ;从数据段中复制总收入到目标数据段中,不同数据项以空格隔开(di=4)
  192.                 mov ax,84[bx]                        ;总收入的低16位
  193.                 mov es:5[di],ax
  194.                 mov dx,86[bx]                        ;总收入的高16位
  195.                 mov es:7[di],dx
  196.                
  197.                 ;计算人均收入=总收入(AX,DX)/雇员人数,  不考虑除法溢出的问题
  198.                 div word ptr 168[si]        ;商存入AX中,不考虑余数
  199.                
  200.                 mov dx,168[si]
  201.                 mov es:10[di],dx                ;复制雇员人数,不同数据项以空格隔开(di=9)
  202.                 mov es:13[di],ax                ;存入人均收入,不同数据项以空格隔开(di=15)
  203.                
  204.                 ;指向一下条(年)的数据
  205.                 add bx,4
  206.                 add si,2
  207.                 add di,16
  208.                
  209.                 loop Lp_i
  210.                
  211. ret

  212. ;将临时字符串显示到DOS界面中
  213. show_str:
  214.                 push di
  215.                 push dx
  216.                 ;设置数据段和附加段(显示缓冲区)
  217.                 mov ax,form
  218.                 mov ds,ax
  219.                 mov ax,0b800h
  220.                 mov es,ax
  221.                
  222.                 mov al,0a0h
  223.                 mul dh                                                ;计算行数的实际地址
  224.                 mov di,ax
  225.                
  226.                 mov al,2h
  227.                 mul dl                                                ;计算列数的实际偏移地址
  228.                 add di,ax
  229.                
  230.                 mov ah,[bp]                                ;取色
  231.                
  232.                 mov bx,0
  233.                 mov si,0
  234.                 mov ch,0
  235. Jp_ss:        mov cl,[si]
  236.                 jcxz R_ss
  237.                 mov al,cl                                        ;取字
  238.                 mov es:[di][bx],ax                ;显示字符.
  239.                
  240.                 inc si
  241.                 add bx,2
  242.                 jmp short Jp_ss
  243.                
  244. R_ss:        pop dx
  245.                 pop di
  246.                 add dl,10
  247.                 ret
  248. code ends
  249. end start
复制代码


注意:1、除法溢出的问题;
           2、寄存器冲突的问题;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-10 23:29:31 | 显示全部楼层
暂时理解不了。慢慢学习研究吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-12 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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