鱼C论坛

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

[技术交流] 课程设计1,贴出来和大家分享分享,不足之处希望指出

[复制链接]
发表于 2012-2-12 16:45:57 | 显示全部楼层 |阅读模式

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

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

x

  1. assume cs:code, ds:data, es:table, ss:stack

  2. data segment

  3. db '1975', '1976', '1977', '1978', '1979', '1980'
  4. db '1981', '1982', '1983', '1984', '1985', '1986'
  5. db '1987', '1988', '1989', '1990', '1991', '1992'
  6. db '1993', '1994', '1995'
  7. ;以上是表示21年的21个字符串

  8. dd 16, 22, 382, 1356, 2390, 8000 ;偏移84
  9. dd 16000, 24486, 50065, 97479, 140417, 197514
  10. dd 345980, 590827, 803530, 1183000, 1843000, 2759000
  11. dd 3753000, 4649000, 5937000
  12. ;以上是表示21年公司总收入的21个dword型数据

  13. dw 3, 7, 9, 13, 28, 38 ;偏移A8
  14. dw 130, 220, 476, 778, 1001, 1442
  15. dw 2258, 2793, 4037, 5635, 8226, 11542
  16. dw 14430, 15257, 17800
  17. ;以上是表示21年公司雇员人数的21个word型数据

  18. data ends

  19. table segment

  20.           db 40 dup (' ')

  21. table ends

  22. stack segment

  23.           dw 16 dup(0)

  24. stack ends

  25. code segment

  26. start:       mov ax, data
  27.                mov ds, ax                 ;设置数据段为原数据所在处
  28.                mov ax, table
  29.                mov es, ax                 ;设置附加段为目标数据所在处
  30.                mov ax, stack
  31.                mov ss, ax                 ;程序中使用的栈空间
  32.                mov sp, 20H              ;设置栈顶指针
  33.                mov bx, 2                  ;行计数器
  34.                mov si, 0
  35.                mov di, 0
  36.                mov bp, 0

  37.                mov cx, 21                 ;设置循环,21次
  38.      main: push cx

  39.                mov si, 15H                ;设置员工数的存放位置
  40.                xor dx, dx
  41.                mov ax, ds:[bp+0A8H]                 ;取得员工数
  42.                call dtoc                      ;将员工数转换为ASCII存放在table段中
  43.                
  44.                mov si, 0AH                 ;设置总收入的存放位置
  45.                mov dx, [di+056H]     ;将总收入的高16位送到dx
  46.                mov ax, [di+054H]     ;将总收入的低16位送到ax
  47.                call dtoc                      ;将总收入数转换为ASCII存放在table段中
  48.                
  49.                mov si, 1FH                 ;设置平均收入的存放位置
  50.                div word ptr ds:[bp+0A8H]       ;计算平均收入
  51.                xor dx, dx                  ;将被除数的高16位清零
  52.                call dtoc
  53.                
  54.                mov dx, [di+2]           ;取得年份高16位
  55.                mov ax, [di]                ;取得年份低16位
  56.                mov es:[0], ax            ;存放年份
  57.                mov es:[2], dx
  58.                
  59.                mov dl, 0                    ;设置末尾0
  60.                mov es:[28H], dl
  61.                
  62.                xor si, si                      ;清空si,es:[si]指向输出字符串的起始处
  63.                
  64.                mov dh, bl                 ;设置显示行数
  65.                mov dl, 20                 ;设置显示列数
  66.                mov cl, 2                   ;设置颜色
  67.                call show_str
  68.                
  69.                add di, 4
  70.                add bp, 2
  71.                inc bx                        ;行数自增1
  72.                
  73.                pop cx
  74.                loop main
  75.                
  76.                mov ax, 4c00H
  77.                int 21H
  78.                
  79.                
  80. dtoc:       push ax
  81.                push bx
  82.                push cx
  83.                push dx
  84.                push si
  85.                push di
  86.                mov di, 0                     ;将计数器置0
  87.                
  88.        d_1: mov cx, 10                 ;将除数放入cx
  89.                call divdw
  90.                add cx, 30H                 ;将数字转换为ASCII码
  91.                push cx                       ;将转换后的ASCII码入栈
  92.                mov cx, dx                 ;将商的高16位放入cx
  93.                inc di
  94.                jcxz d_2                      ;如果商的高16位为0,则跳转进行判断低16位
  95.                jmp short d_1
  96.                
  97.        d_2: mov cx, ax                 ;将商的低16位放入cx
  98.                jcxz d_3
  99.                jmp short d_1
  100.                
  101.        d_3: mov cx, di                  ;设置循环变量
  102.                
  103.        d_4: pop dx                       ;将转换后的ASCII码出栈,放入DX
  104.                mov es:[si], dl
  105.                inc si
  106.                loop d_4
  107.                
  108.                pop di
  109.                pop si
  110.                pop dx
  111.                pop cx
  112.                pop bx
  113.                pop ax
  114.                retn
  115.                
  116. divdw:     push bx
  117.                push si

  118.                mov bx, ax                 ;保存被除数的低16位
  119.                mov ax, dx                 ;将高16位放置在AX中
  120.                xor dx, dx                  ;高16位清零
  121.                div cx                         ;高16位进行除法,商在AX 余数在DX
  122.                mov si, ax                  ;保存高16位的商
  123.                mov ax, bx
  124.                div cx                        ;低16位进行除法,商在AX 余数在DX
  125.                mov cx, dx
  126.                mov dx, si

  127.                pop si
  128.                pop bx
  129.                retn

  130. show_str: push ax                  ;将子程序中使用的寄存器原始值压入栈
  131.                 push bx
  132.                 push di
  133.                 push es
  134.                 push ds
  135.                
  136.                 mov ax, es
  137.                 mov ds, ax
  138.                 mov ax, 0B800H
  139.                 mov es, ax                 ;存放显存起始地址
  140.                 mov ax, 0A0H
  141.                 mul dh                        ;计算行偏移地址,存放在ax中
  142.                 mov di, ax
  143.                 mov ax, 2H
  144.                 mul dl                        ;计算列偏移地址,存放在ax中
  145.                 add di, ax                  ;行+列=总偏移 es:[di]将定位到输出位置
  146.                 mov bh, cl                 ;保存颜色代码,存放bx高位
  147.                 xor cx, cx
  148.                
  149.             s: mov cl, ds:[si]
  150.                 jcxz retFlag                ;如果读取结束,返回
  151.                 mov bl, cl                  ;保存字符ASCII码,存放bx低位
  152.                 mov es:[di], bx
  153.                 add di, 2
  154.                 inc si
  155.                 jmp short s                 ;继续循环读取
  156.                
  157.      retFlag:pop ds                    
  158.                 pop es
  159.                 pop di
  160.                 pop bx
  161.                 pop ax
  162.                 retn
  163. code ends

  164. end start
复制代码
不容易啊,总算写出来了!!!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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