鱼C论坛

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

[已解决]求助王爽课程设计1

[复制链接]
发表于 2022-10-13 10:04:09 | 显示全部楼层 |阅读模式

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

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

x
我的想法是先把表格建好,然后在show_str里面同时完成转换字符串和输出功能
但是总是只输出年份,调试来调试去现在一运行就死机
我已经卡了五六天了,改的头晕眼花,救救孩子吧


assume cs:code

data segment
        db'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
data ends

table segment
        db 21 dup ('year summ ne ?? ')

table ends

a segment
        db 20 dup(0)  ;重复利用,用来存每一次转换的字符串
a ends

stack segment
        dw 60 dup(0)  ;栈
stack ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stack
        mov ss,ax
        mov sp,120
        call set_table

        mov ax,0b800h
        mov ds,ax
        mov bx,160
        mov bp,0
        
   show:call show_str
        add bx,160           ;bx表示屏幕行
        add bp,16                   ;bp表示table行
        

        mov ax,4c00h
        int 21h
============================================
set_table:                 ;建表格
        mov ax,data
        mov ds,ax
        mov si,0
        mov bx,0

        mov ax,table
        mov es,ax
        mov bp,0
        mov cx,21
      s:mov ax,ds:[bx].0[di]      ;年份
        mov es:[bp].0,ax
        mov ax,ds:[bx].2[di]
        mov es:[bp].2,ax

        mov ax,ds:[bx].84[di]    ;总收入
        mov es:[bp].5,ax
        mov ax,ds:[bx].86[di]
        mov es:[bp].7,ax

        mov ax,ds:[bx].168[di]     ;人数
        mov es:[bp].10,ax

        mov ax,ds:[bx].84         ;人均
        mov dx,ds:[bx].86
        div word ptr ds:[bx].168

        mov es:[bp].14,ax

        add di,4
        add si,2
        add bp,16

        loop s
        ret
==============================================
show_str:             ;show_str函数
        push cx
        push bx
        push bp
        
show_year:
        mov si,0
        mov di,0
        mov cx,4
        
     s1:mov al,es:[bp].0[si]
        mov ds:[bx].0[di],al
        inc si
        add di,2
        loop s1

show_salary:
        mov si,0
        mov di,0
        mov ax,es:[bp].5
        mov dx,es:[bp].7
        call dtoc
        push ss
        mov ax,a
        mov ss,ax
        mov si,0
        mov di,0
        mov bx,160
        mov bp,0
     s2:mov al,ss:[si]
        mov ah,0
        mov cx,ax
        jcxz ok
        mov ds:[bx].20[di],al
        inc si
        add di,2
        jmp short s2

     ok:pop ss

show_mans:
        mov si,0
        mov di,0
        mov ax,es:[bp].0ah
        mov dx,0
        call dtoc
        push es
        mov ax,a
        mov es,ax
     s3:mov al,es:[si]
        mov ah,0
        mov cx,ax
        jcxz ok1
        mov ds:[bx].40[di],al
        inc si
        add di,2
        jmp short s3
    ok1:pop es

show_mansalary:
        mov si,0
        mov di,0
        mov ax,es:[bp].0dh
        mov dx,0
        call dtoc
        push es
        mov ax,a
        mov es,ax
     s4:mov al,es:[si]
        mov ah,0
        mov cx,ax
        jcxz ok2
        mov ds:[bx].60[di],al
        inc si
        add di,2
        jmp short s4
    ok2:pop es
        
        pop bp
        pop bx
        pop cx
        ret
================================================
dtoc:                                       ;转换字符串
        push ax
        push dx
        push cx
        push ds
        push si
        push di
        mov bx,a
        mov ds,bx
        mov bx,0
        mov si,0
     s5:mov cx,10
        call divdw
        add cx,30h
        push cx
        inc si
        mov cx,ax
        jcxz ok3
        jmp short s5
    ok3:mov cx,dx                       ;从网上抄的判断操作
        jcxz ok4
        jmp short s5
    ok4:mov cx,si
        mov si,0
     s6:pop ax
        mov ds:[si],al
        inc si
        loop s6
        mov al,0
        mov byte ptr ds:[si],al
        pop di
        pop si
        pop ds
        pop cx
        pop dx
        pop ax
        ret
=============================================
divdw:                                         ;除法溢出处理函数
        push bx
        push si
        push di
        push bp

        mov bx,ax
        mov ax,dx
        mov dx,0
        div cx
        mov si,ax
        mov ax,bx
        div cx
        mov cx,dx
        mov dx,si

        pop bp
        pop di
        pop si
        pop bx
        ret
code ends
end start
最佳答案
2022-10-13 13:33:50
本帖最后由 jackz007 于 2022-10-13 14:57 编辑
  1. assume cs:code , ds:data , es:table

  2. data segment para public 'DATA'
  3.         db'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
  4.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  5.         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
  6. buff01  db 100h dup(00)
  7. buff02  db 100h dup(00)
  8. buff03  db 100h dup(00)
  9. buff04  db 100h dup(00)
  10. data ends

  11. table segment para public 'DATA'
  12.         db 21 dup ('year summ ne ?? ')
  13. table ends

  14. stack segment para stack
  15.         dw 800h dup(0)     ;
  16. stack ends

  17. code segment para public 'CODE'
  18. ;============================================
  19. pause proc near
  20.         push ax
  21.         xor ax,ax
  22.         int 16h
  23.         pop ax
  24.         ret
  25. pause endp
  26. ;============================================
  27. show_crlf proc near
  28.         push ax
  29.         push dx
  30.         mov ah,2
  31.         mov dl,10
  32.         int 21h
  33.         mov dl,13
  34.         int 21h
  35.         pop dx
  36.         pop ax
  37.         ret
  38. show_crlf endp
  39. ;============================================
  40. show_dec proc near
  41.         push bp
  42.         mov bp,sp
  43.         push ax
  44.         push cx
  45.         push dx
  46.         push si
  47.         push di
  48.         push ds
  49.         mov ax,[bp+4]
  50.         mov si,offset buff01
  51.         push si
  52.         mov cx,10
  53. dec01:  xor dx,dx
  54.         div cx
  55.         add dl,'0'
  56.         mov byte ptr ds:[si],dl        
  57.         inc si
  58.         or ax,ax
  59.         jnz dec01
  60.         mov byte ptr ds:[si],al
  61.         lea di,[si-1]
  62.         pop si
  63.         push si
  64. dec02:  cmp si,di
  65.         jae dec03
  66.         mov al,byte ptr[si]
  67.         xchg byte ptr[di],al
  68.         mov byte ptr ds:[si],al
  69.         inc si
  70.         dec di
  71.         jmp short dec02
  72. dec03:  pop si
  73.         mov ah,2
  74. dec04:  mov dl,ds:byte ptr[si]
  75.         or dl,dl
  76.         jz dec05
  77.         int 21h
  78.         inc si
  79.         jmp short dec04        
  80. dec05:  pop ds
  81.         pop di
  82.         pop si
  83.         pop dx
  84.         pop cx
  85.         pop ax
  86.         mov sp,bp
  87.         pop bp
  88.         ret
  89. show_dec endp
  90. ;============================================
  91. show_str proc near
  92.         push bp
  93.         mov bp,sp
  94.         push ax
  95.         push si
  96.         push di
  97.         push ds
  98.         push es
  99.         lds si , [bp+4]
  100.         cld
  101.         mov ah,2
  102. str01:  lodsb
  103.         or al,al
  104.         jz str02
  105.         mov dl,al
  106.         int 21h
  107.         jmp short str01
  108. str02:  pop es
  109.         pop ds
  110.         pop di
  111.         pop si
  112.         pop ax
  113.         mov sp,bp
  114.         pop bp
  115.         ret
  116. show_str endp
  117. ;============================================
  118. maketab proc near
  119.         push bp
  120.         mov bp,sp
  121.         push ax
  122.         push bx
  123.         push cx
  124.         push dx
  125.         push si
  126.         push di
  127.         push ds
  128.         push es
  129.         mov ax,data
  130.         mov ds,ax
  131.         mov ax,table
  132.         mov es,ax
  133.         xor si,si
  134.         xor di,di
  135.         mov cx,21
  136.         cld
  137.         push cx
  138.         push di
  139.         push cx
  140.         push di
  141. make01: push cx
  142.         mov cx,4
  143.         repe movsb
  144.         add di,12
  145.         pop cx
  146.         loop make01
  147.         pop di
  148.         add di,5
  149.         pop cx
  150.         push cx
  151.         push di
  152. make02: movsw
  153.         movsw
  154.         add di,12
  155.         loop make02
  156.         pop di
  157.         add di,5
  158.         pop cx
  159. make03: movsw
  160.         add di,14
  161.         loop make03
  162.         pop di
  163.         pop cx
  164.         push es
  165.         pop ds
  166. make04: push cx
  167.         push di
  168.         mov ax,word ptr[di+5]
  169.         mov dx,word ptr[di+7]
  170.         mov cx,word ptr[di+10]
  171.         div cx
  172.         mov word ptr ds:[di+13],ax
  173.         pop di
  174.         add di,16
  175.         pop cx
  176.         loop make04
  177.         pop es
  178.         pop ds
  179.         pop di
  180.         pop si
  181.         pop dx
  182.         pop cx
  183.         pop bx
  184.         pop ax
  185.         mov sp,bp
  186.         pop bp
  187.         ret
  188. maketab endp
  189. ;=============================================
  190. main proc far
  191.         mov ax,data
  192.         mov ds,ax
  193.         mov ax,table
  194.         mov es,ax
  195.         call maketab        ; 传送数据填表 + 计算平均薪水填表
  196.         xor bx,bx
  197.         mov cx,21
  198.         push bx
  199.         push cx
  200. main01: push word ptr es:[bx+10]
  201.         call show_dec
  202.         add sp,2
  203.         call show_crlf
  204.         add bx,16
  205.         loop main01
  206.         call pause
  207.         call show_crlf        
  208.         pop cx
  209.         pop bx
  210. main02: push word ptr es:[bx+13]
  211.         call show_dec
  212.         add sp,2
  213.         call show_crlf
  214.         add bx,16
  215.         loop main02
  216.         call pause
  217.         mov ax,4c00h
  218.         int 21h
  219. main endp
  220. ;=============================================
  221. code ends
  222. end main
复制代码

        运行实况:
  1. 3
  2. 7
  3. 9
  4. 13
  5. 28
  6. 38
  7. 130
  8. 220
  9. 476
  10. 778
  11. 1001
  12. 1442
  13. 2258
  14. 2793
  15. 4037
  16. 5635
  17. 8226
  18. 11542
  19. 14430
  20. 15257
  21. 17800

  22. 5
  23. 3
  24. 42
  25. 104
  26. 85
  27. 210
  28. 123
  29. 111
  30. 105
  31. 125
  32. 140
  33. 136
  34. 153
  35. 211
  36. 199
  37. 209
  38. 224
  39. 239
  40. 260
  41. 304
  42. 333
复制代码

        空行前半部分是显示 table 中 23 年的员工数量,后半部分显示的是 table 中 23 年中,每年的员工平均收入,计算方法,自然是总薪水除以员工总数,相关数据也是取自 table,楼主可以计算验证。
        这个作业涉及除法溢出的问题,不用专门处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-13 13:33:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-13 14:57 编辑
  1. assume cs:code , ds:data , es:table

  2. data segment para public 'DATA'
  3.         db'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
  4.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  5.         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800
  6. buff01  db 100h dup(00)
  7. buff02  db 100h dup(00)
  8. buff03  db 100h dup(00)
  9. buff04  db 100h dup(00)
  10. data ends

  11. table segment para public 'DATA'
  12.         db 21 dup ('year summ ne ?? ')
  13. table ends

  14. stack segment para stack
  15.         dw 800h dup(0)     ;
  16. stack ends

  17. code segment para public 'CODE'
  18. ;============================================
  19. pause proc near
  20.         push ax
  21.         xor ax,ax
  22.         int 16h
  23.         pop ax
  24.         ret
  25. pause endp
  26. ;============================================
  27. show_crlf proc near
  28.         push ax
  29.         push dx
  30.         mov ah,2
  31.         mov dl,10
  32.         int 21h
  33.         mov dl,13
  34.         int 21h
  35.         pop dx
  36.         pop ax
  37.         ret
  38. show_crlf endp
  39. ;============================================
  40. show_dec proc near
  41.         push bp
  42.         mov bp,sp
  43.         push ax
  44.         push cx
  45.         push dx
  46.         push si
  47.         push di
  48.         push ds
  49.         mov ax,[bp+4]
  50.         mov si,offset buff01
  51.         push si
  52.         mov cx,10
  53. dec01:  xor dx,dx
  54.         div cx
  55.         add dl,'0'
  56.         mov byte ptr ds:[si],dl        
  57.         inc si
  58.         or ax,ax
  59.         jnz dec01
  60.         mov byte ptr ds:[si],al
  61.         lea di,[si-1]
  62.         pop si
  63.         push si
  64. dec02:  cmp si,di
  65.         jae dec03
  66.         mov al,byte ptr[si]
  67.         xchg byte ptr[di],al
  68.         mov byte ptr ds:[si],al
  69.         inc si
  70.         dec di
  71.         jmp short dec02
  72. dec03:  pop si
  73.         mov ah,2
  74. dec04:  mov dl,ds:byte ptr[si]
  75.         or dl,dl
  76.         jz dec05
  77.         int 21h
  78.         inc si
  79.         jmp short dec04        
  80. dec05:  pop ds
  81.         pop di
  82.         pop si
  83.         pop dx
  84.         pop cx
  85.         pop ax
  86.         mov sp,bp
  87.         pop bp
  88.         ret
  89. show_dec endp
  90. ;============================================
  91. show_str proc near
  92.         push bp
  93.         mov bp,sp
  94.         push ax
  95.         push si
  96.         push di
  97.         push ds
  98.         push es
  99.         lds si , [bp+4]
  100.         cld
  101.         mov ah,2
  102. str01:  lodsb
  103.         or al,al
  104.         jz str02
  105.         mov dl,al
  106.         int 21h
  107.         jmp short str01
  108. str02:  pop es
  109.         pop ds
  110.         pop di
  111.         pop si
  112.         pop ax
  113.         mov sp,bp
  114.         pop bp
  115.         ret
  116. show_str endp
  117. ;============================================
  118. maketab proc near
  119.         push bp
  120.         mov bp,sp
  121.         push ax
  122.         push bx
  123.         push cx
  124.         push dx
  125.         push si
  126.         push di
  127.         push ds
  128.         push es
  129.         mov ax,data
  130.         mov ds,ax
  131.         mov ax,table
  132.         mov es,ax
  133.         xor si,si
  134.         xor di,di
  135.         mov cx,21
  136.         cld
  137.         push cx
  138.         push di
  139.         push cx
  140.         push di
  141. make01: push cx
  142.         mov cx,4
  143.         repe movsb
  144.         add di,12
  145.         pop cx
  146.         loop make01
  147.         pop di
  148.         add di,5
  149.         pop cx
  150.         push cx
  151.         push di
  152. make02: movsw
  153.         movsw
  154.         add di,12
  155.         loop make02
  156.         pop di
  157.         add di,5
  158.         pop cx
  159. make03: movsw
  160.         add di,14
  161.         loop make03
  162.         pop di
  163.         pop cx
  164.         push es
  165.         pop ds
  166. make04: push cx
  167.         push di
  168.         mov ax,word ptr[di+5]
  169.         mov dx,word ptr[di+7]
  170.         mov cx,word ptr[di+10]
  171.         div cx
  172.         mov word ptr ds:[di+13],ax
  173.         pop di
  174.         add di,16
  175.         pop cx
  176.         loop make04
  177.         pop es
  178.         pop ds
  179.         pop di
  180.         pop si
  181.         pop dx
  182.         pop cx
  183.         pop bx
  184.         pop ax
  185.         mov sp,bp
  186.         pop bp
  187.         ret
  188. maketab endp
  189. ;=============================================
  190. main proc far
  191.         mov ax,data
  192.         mov ds,ax
  193.         mov ax,table
  194.         mov es,ax
  195.         call maketab        ; 传送数据填表 + 计算平均薪水填表
  196.         xor bx,bx
  197.         mov cx,21
  198.         push bx
  199.         push cx
  200. main01: push word ptr es:[bx+10]
  201.         call show_dec
  202.         add sp,2
  203.         call show_crlf
  204.         add bx,16
  205.         loop main01
  206.         call pause
  207.         call show_crlf        
  208.         pop cx
  209.         pop bx
  210. main02: push word ptr es:[bx+13]
  211.         call show_dec
  212.         add sp,2
  213.         call show_crlf
  214.         add bx,16
  215.         loop main02
  216.         call pause
  217.         mov ax,4c00h
  218.         int 21h
  219. main endp
  220. ;=============================================
  221. code ends
  222. end main
复制代码

        运行实况:
  1. 3
  2. 7
  3. 9
  4. 13
  5. 28
  6. 38
  7. 130
  8. 220
  9. 476
  10. 778
  11. 1001
  12. 1442
  13. 2258
  14. 2793
  15. 4037
  16. 5635
  17. 8226
  18. 11542
  19. 14430
  20. 15257
  21. 17800

  22. 5
  23. 3
  24. 42
  25. 104
  26. 85
  27. 210
  28. 123
  29. 111
  30. 105
  31. 125
  32. 140
  33. 136
  34. 153
  35. 211
  36. 199
  37. 209
  38. 224
  39. 239
  40. 260
  41. 304
  42. 333
复制代码

        空行前半部分是显示 table 中 23 年的员工数量,后半部分显示的是 table 中 23 年中,每年的员工平均收入,计算方法,自然是总薪水除以员工总数,相关数据也是取自 table,楼主可以计算验证。
        这个作业涉及除法溢出的问题,不用专门处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 11:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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