鱼C论坛

 找回密码
 立即注册
查看: 1303|回复: 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 编辑
assume cs:code , ds:data , es:table

data segment para public 'DATA'
        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
buff01  db 100h dup(00)
buff02  db 100h dup(00)
buff03  db 100h dup(00)
buff04  db 100h dup(00)
data ends

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

stack segment para stack
        dw 800h dup(0)     ;
stack ends

code segment para public 'CODE'
;============================================
pause proc near
        push ax
        xor ax,ax
        int 16h
        pop ax
        ret
pause endp
;============================================
show_crlf proc near
        push ax
        push dx
        mov ah,2
        mov dl,10
        int 21h
        mov dl,13
        int 21h
        pop dx
        pop ax
        ret
show_crlf endp
;============================================
show_dec proc near
        push bp
        mov bp,sp
        push ax
        push cx
        push dx
        push si
        push di
        push ds
        mov ax,[bp+4]
        mov si,offset buff01
        push si
        mov cx,10
dec01:  xor dx,dx
        div cx
        add dl,'0'
        mov byte ptr ds:[si],dl        
        inc si
        or ax,ax
        jnz dec01
        mov byte ptr ds:[si],al
        lea di,[si-1]
        pop si
        push si
dec02:  cmp si,di
        jae dec03
        mov al,byte ptr[si]
        xchg byte ptr[di],al
        mov byte ptr ds:[si],al
        inc si
        dec di
        jmp short dec02
dec03:  pop si
        mov ah,2
dec04:  mov dl,ds:byte ptr[si]
        or dl,dl
        jz dec05
        int 21h
        inc si
        jmp short dec04        
dec05:  pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop ax
        mov sp,bp
        pop bp
        ret
show_dec endp
;============================================
show_str proc near
        push bp
        mov bp,sp
        push ax
        push si
        push di
        push ds
        push es
        lds si , [bp+4]
        cld
        mov ah,2
str01:  lodsb
        or al,al
        jz str02
        mov dl,al
        int 21h
        jmp short str01
str02:  pop es
        pop ds
        pop di
        pop si
        pop ax
        mov sp,bp
        pop bp
        ret
show_str endp
;============================================
maketab proc near
        push bp
        mov bp,sp
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        push ds
        push es
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        xor si,si
        xor di,di
        mov cx,21
        cld
        push cx
        push di
        push cx
        push di
make01: push cx
        mov cx,4
        repe movsb
        add di,12
        pop cx
        loop make01
        pop di
        add di,5
        pop cx
        push cx
        push di
make02: movsw
        movsw
        add di,12
        loop make02
        pop di
        add di,5
        pop cx
make03: movsw
        add di,14
        loop make03
        pop di
        pop cx
        push es
        pop ds
make04: push cx
        push di
        mov ax,word ptr[di+5]
        mov dx,word ptr[di+7]
        mov cx,word ptr[di+10]
        div cx
        mov word ptr ds:[di+13],ax
        pop di
        add di,16
        pop cx
        loop make04
        pop es
        pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        mov sp,bp
        pop bp
        ret
maketab endp
;=============================================
main proc far
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        call maketab        ; 传送数据填表 + 计算平均薪水填表
        xor bx,bx
        mov cx,21
        push bx
        push cx
main01: push word ptr es:[bx+10]
        call show_dec
        add sp,2
        call show_crlf
        add bx,16
        loop main01
        call pause
        call show_crlf        
        pop cx
        pop bx
main02: push word ptr es:[bx+13]
        call show_dec
        add sp,2
        call show_crlf
        add bx,16
        loop main02 
        call pause
        mov ax,4c00h
        int 21h
main endp
;=============================================
code ends
end main
        运行实况:
3
7
9
13
28
38
130
220
476
778
1001
1442
2258
2793
4037
5635
8226
11542
14430
15257
17800

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

使用道具 举报

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

data segment para public 'DATA'
        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
buff01  db 100h dup(00)
buff02  db 100h dup(00)
buff03  db 100h dup(00)
buff04  db 100h dup(00)
data ends

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

stack segment para stack
        dw 800h dup(0)     ;
stack ends

code segment para public 'CODE'
;============================================
pause proc near
        push ax
        xor ax,ax
        int 16h
        pop ax
        ret
pause endp
;============================================
show_crlf proc near
        push ax
        push dx
        mov ah,2
        mov dl,10
        int 21h
        mov dl,13
        int 21h
        pop dx
        pop ax
        ret
show_crlf endp
;============================================
show_dec proc near
        push bp
        mov bp,sp
        push ax
        push cx
        push dx
        push si
        push di
        push ds
        mov ax,[bp+4]
        mov si,offset buff01
        push si
        mov cx,10
dec01:  xor dx,dx
        div cx
        add dl,'0'
        mov byte ptr ds:[si],dl        
        inc si
        or ax,ax
        jnz dec01
        mov byte ptr ds:[si],al
        lea di,[si-1]
        pop si
        push si
dec02:  cmp si,di
        jae dec03
        mov al,byte ptr[si]
        xchg byte ptr[di],al
        mov byte ptr ds:[si],al
        inc si
        dec di
        jmp short dec02
dec03:  pop si
        mov ah,2
dec04:  mov dl,ds:byte ptr[si]
        or dl,dl
        jz dec05
        int 21h
        inc si
        jmp short dec04        
dec05:  pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop ax
        mov sp,bp
        pop bp
        ret
show_dec endp
;============================================
show_str proc near
        push bp
        mov bp,sp
        push ax
        push si
        push di
        push ds
        push es
        lds si , [bp+4]
        cld
        mov ah,2
str01:  lodsb
        or al,al
        jz str02
        mov dl,al
        int 21h
        jmp short str01
str02:  pop es
        pop ds
        pop di
        pop si
        pop ax
        mov sp,bp
        pop bp
        ret
show_str endp
;============================================
maketab proc near
        push bp
        mov bp,sp
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        push ds
        push es
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        xor si,si
        xor di,di
        mov cx,21
        cld
        push cx
        push di
        push cx
        push di
make01: push cx
        mov cx,4
        repe movsb
        add di,12
        pop cx
        loop make01
        pop di
        add di,5
        pop cx
        push cx
        push di
make02: movsw
        movsw
        add di,12
        loop make02
        pop di
        add di,5
        pop cx
make03: movsw
        add di,14
        loop make03
        pop di
        pop cx
        push es
        pop ds
make04: push cx
        push di
        mov ax,word ptr[di+5]
        mov dx,word ptr[di+7]
        mov cx,word ptr[di+10]
        div cx
        mov word ptr ds:[di+13],ax
        pop di
        add di,16
        pop cx
        loop make04
        pop es
        pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        mov sp,bp
        pop bp
        ret
maketab endp
;=============================================
main proc far
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        call maketab        ; 传送数据填表 + 计算平均薪水填表
        xor bx,bx
        mov cx,21
        push bx
        push cx
main01: push word ptr es:[bx+10]
        call show_dec
        add sp,2
        call show_crlf
        add bx,16
        loop main01
        call pause
        call show_crlf        
        pop cx
        pop bx
main02: push word ptr es:[bx+13]
        call show_dec
        add sp,2
        call show_crlf
        add bx,16
        loop main02 
        call pause
        mov ax,4c00h
        int 21h
main endp
;=============================================
code ends
end main
        运行实况:
3
7
9
13
28
38
130
220
476
778
1001
1442
2258
2793
4037
5635
8226
11542
14430
15257
17800

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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