鱼C论坛

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

[已解决]急,课程设计一竟然我写处了17处错误!!!

[复制链接]
发表于 2017-3-21 20:12:56 | 显示全部楼层 |阅读模式

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

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

x
编写程序为王爽老师的《汇编语言》第211页课程设计一
编写工具 Notepa++
编译环境 XP虚拟机
编译工具 masm5.0
问题代码 设计1.zip

源代码:
assume cs:code,ds:data,es:table

data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 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

    dw 11452,14430,15257,17800
data ends

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

fruit segment
    db 32 dup(0)
fruit ends

code segment
   

;初始化阶段
;将原始数据整理放到table处
;套用实验七的程序加以修改

start:        mov ax,data
            mov ds,ax
            mov ax,table
            mov es,ax
            mov si,0
            mov bx,0
            mov di,0
            mov cx,21
s0:            mov ax,[bx]               
            mov es:[si],ax
            mov ax,[bx+2]            
            mov es:[si+2],ax   
            
            mov ax,[bx+84]
            mov es:[si+5],ax
            mov dx,[bx+86]
            mov es:[si+7],dx
            
            div word ptr [168+di]
            mov es:[si+13],ax
            
            mov ax,[168+di]
            mov es:[si+10],ax
            
            add di,2
            add si,10h
            add bx,4
            loop s0
            
            
;准备阶段
;将数据转换为ASC码格式
;存储在fruit段

            mov ax,table
            mov ds,ax               
            mov dh,3                ;dh代表行号(0~24)
            mov dl,3                ;dl代表列号(0~79)
            mov al,160
            mul dh                    ;相乘得出行地址存在ax
            mov bx,ax                ;ax后面用到,转移到bx
            mov al,2
            mul dl                    ;相乘得出列地址存在ax
            add bx,ax                ;行列相加得到真正地址,存放在bx
            mov bp,0
            mov cx,21
            
            
s1:            push cx
            push bx
            mov ax,fruit
            mov es,ax
            mov si,0
            mov di,0
            mov ax,0
            mov dx,0
            
            mov ax,ds:[bp+di]        ;将年份放进目标段
            mov es:[si],ax
            mov ax,ds:[bp+di].2
            mov es:[si].2,ax   
            add si,6
            add di,5
            
            
            mov ax,ds:[bp+di]        ;将总金额放进目标段
            mov dx,ds:[bp+di].2   
            call dtoc
            add si,10
            add di,5
            
            mov ax,ds:[bp+di]        ;将人数放进目标段
            mov dx,0
            call dtoc
            add si,6
            add di,3
            
            mov ax,ds:[bp+di]        ;将人均金额放进目标段
            mov dx,0
            call dtoc
            
            
;打印输出阶段            
            
            mov ax,fruit            ;段地址切换
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            
            mov si,0                ;循环实现0转换为空格,并以0结尾
            mov cx,29
a:            push cx
            mov cl,[si]            
            jcxz b
c:            inc si
            pop cx
            loop a
            mov byte ptr [si],0
b:            mov byte ptr [si],20h   
            jmp shor c
            
            
            mov si,0
            call show_str
            
            
            
            
            pop bx
            pop cx
            add bx,0a0h                ;转移到下一行显存
            add bp,0ah                ;table段切换到下一行
            loop s1

            mov ax,4c00h
            int 21h

            
            
            
            

dtoc:        push ax
            push bx
            push cx
            push dx
            push si
            push di
            mov di,0
            mov cx,ax
            jcxz short s3            ;低位为0,跳转到s3判断
            mov cx,0ah
s2:            call divdw                ;引用实验十(2)除法模块
            add cx,30h
            push cx            
            inc di
            jmp short dtoc
s3:            mov cx,dx
            jcxz s4                    ;高低位均位0,结束
            jmp short s2
s4:            mov cx,di
s5:            pop ax
            mov es:[si],al
            inc si
            loop s5
            pop    di
            pop si
            pop dx
            pop cx
            pop bx
            pop ax
            ret
   
   
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
;      (dx)=dword型数据的高16位;
;      (cx)=除数。
;返回:(dx)=结果的高16位;
;      (ax)=结果的低16位;
;      (cx)=余数。   
        
divdw:        push di
            push ax                ;ax后面做除法要用到,暂存到栈
            mov ax,dx            
            mov dx,0            ;被除数高位为0,低位为H
            div cx
            mov di,ax            ;商暂存
            pop ax                ;取出L,此时高位为H/N的余数,低位为L
            div cx
            mov cx,dx            ;余数
            mov dx,di            ;商高位
            pop di
            ret   
            
   
show_str:    mov al,2
            mov ch,0
            
d1:            mov cl,[si]
            jcxz q
            mov dl,ds:[si]
            mov es:[bx],dl            ;字符
            mov es:[bx].1,al        ;颜色
            inc si                    ;存放顺序为倒序,自减一
            add bx,2

            loop d1
q:            ret                    
            
            
        

code ends

end start   



最佳答案
2017-3-21 20:38:46
assume cs:code,ds:data,es:table

data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 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

    dw 11452,14430,15257,17800
data ends

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

fruit segment
        db 32 dup(0)
fruit ends

code segment 
        

;初始化阶段 
;将原始数据整理放到table处
;套用实验七的程序加以修改

start:                mov ax,data
                        mov ds,ax
                        mov ax,table
                        mov es,ax
                        mov si,0
                        mov bx,0
                        mov di,0
                        mov cx,21
s0:                        mov ax,[bx]                                
                        mov es:[si],ax
                        mov ax,[bx+2]                        
                        mov es:[si+2],ax        
                        
                        mov ax,[bx+84]
                        mov es:[si+5],ax
                        mov dx,[bx+86]
                        mov es:[si+7],dx
                        
                        div word ptr [168+di]
                        mov es:[si+13],ax
                        
                        mov ax,[168+di]
                        mov es:[si+10],ax
                        
                        add di,2
                        add si,10h
                        add bx,4
                        loop s0
                        
                        
;准备阶段
;将数据转换为ASC码格式
;存储在fruit段

                        mov ax,table
                        mov ds,ax                                
                        mov dh,3                                ;dh代表行号(0~24)
                        mov dl,3                                ;dl代表列号(0~79)
                        mov al,160
                        mul dh                                        ;相乘得出行地址存在ax
                        mov bx,ax                                ;ax后面用到,转移到bx
                        mov al,2
                        mul dl                                        ;相乘得出列地址存在ax
                        add bx,ax                                ;行列相加得到真正地址,存放在bx
                        mov bp,0
                        mov cx,21
                        
                        
s1:                        push cx
                        push bx
                        mov ax,fruit 
                        mov es,ax
                        mov si,0
                        mov di,0
                        mov ax,0
                        mov dx,0
                        
                        mov ax,ds:[bp+di]                ;将年份放进目标段 
                        mov es:[si],ax
                        ;mov ax,ds:[bp+di].2 ;  我没有见过这种写法
                        ;mov es:[si].2,ax        
                        add si,6
                        add di,5
                        
                        
                        mov ax,ds:[bp+di]                ;将总金额放进目标段 
                        ;mov dx,ds:[bp+di].2        
                        call dtoc
                        add si,10
                        add di,5
                        
                        mov ax,ds:[bp+di]                ;将人数放进目标段 
                        mov dx,0
                        call dtoc
                        add si,6
                        add di,3
                        
                        mov ax,ds:[bp+di]                ;将人均金额放进目标段 
                        mov dx,0
                        call dtoc
                        
                        
;打印输出阶段                        
                        
                        mov ax,fruit                        ;段地址切换
                        mov ds,ax
                        mov ax,0b800h
                        mov es,ax
                        
                        mov si,0                                ;循环实现0转换为空格,并以0结尾
                        mov cx,29
a:                        push cx
                        mov cl,[si]                        
                        jcxz b
;不要用标号c                        
c1:                        inc si
                        pop cx
                        loop a
                        mov byte ptr [si],0
b:                        mov byte ptr [si],20h        
                        jmp short c1
                        
                        
                        mov si,0
                        call show_str
                        
                        
                        
                        
                        pop bx
                        pop cx
                        add bx,0a0h                                ;转移到下一行显存
                        add bp,0ah                                ;table段切换到下一行
                        loop s1

                        mov ax,4c00h
                        int 21h

                        
                        
                        
                        

dtoc:                push ax
                        push bx
                        push cx
                        push dx
                        push si
                        push di
                        mov di,0
                        mov cx,ax
                        jcxz short s3                        ;低位为0,跳转到s3判断
                        mov cx,0ah
s2:                        call divdw                                ;引用实验十(2)除法模块
                        add cx,30h
                        push cx                        
                        inc di
                        jmp short dtoc
s3:                        mov cx,dx
                        jcxz s4                                        ;高低位均位0,结束
                        jmp short s2 
s4:                        mov cx,di
s5:                        pop ax
                        mov es:[si],al
                        inc si
                        loop s5
                        pop        di
                        pop si
                        pop dx
                        pop cx
                        pop bx
                        pop ax
                        ret
        
        
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
;      (dx)=dword型数据的高16位;
;      (cx)=除数。
;返回:(dx)=结果的高16位;
;      (ax)=结果的低16位;
;      (cx)=余数。        
                
divdw:                push di
                        push ax                                ;ax后面做除法要用到,暂存到栈
                        mov ax,dx                        
                        mov dx,0                        ;被除数高位为0,低位为H
                        div cx
                        mov di,ax                        ;商暂存
                        pop ax                                ;取出L,此时高位为H/N的余数,低位为L
                        div cx
                        mov cx,dx                        ;余数
                        mov dx,di                        ;商高位
                        pop di
                        ret        
                        
        
show_str:        mov al,2
                        mov ch,0
                        
d1:                        mov cl,[si]
                        jcxz q
                        mov dl,ds:[si]
                        mov es:[bx],dl                        ;字符
                        ;mov es:[bx].1,al                ;颜色
                        inc si                                        ;存放顺序为倒序,自减一
                        add bx,2

                        loop d1
q:                        ret                                        
                        
                        
                

code ends

end start        

错误提示

错误提示

设计1.zip

1.84 KB, 下载次数: 1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-21 20:14:12 | 显示全部楼层
求各位大佬帮帮吗!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-21 20:38:46 | 显示全部楼层    本楼为最佳答案   
assume cs:code,ds:data,es:table

data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 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

    dw 11452,14430,15257,17800
data ends

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

fruit segment
        db 32 dup(0)
fruit ends

code segment 
        

;初始化阶段 
;将原始数据整理放到table处
;套用实验七的程序加以修改

start:                mov ax,data
                        mov ds,ax
                        mov ax,table
                        mov es,ax
                        mov si,0
                        mov bx,0
                        mov di,0
                        mov cx,21
s0:                        mov ax,[bx]                                
                        mov es:[si],ax
                        mov ax,[bx+2]                        
                        mov es:[si+2],ax        
                        
                        mov ax,[bx+84]
                        mov es:[si+5],ax
                        mov dx,[bx+86]
                        mov es:[si+7],dx
                        
                        div word ptr [168+di]
                        mov es:[si+13],ax
                        
                        mov ax,[168+di]
                        mov es:[si+10],ax
                        
                        add di,2
                        add si,10h
                        add bx,4
                        loop s0
                        
                        
;准备阶段
;将数据转换为ASC码格式
;存储在fruit段

                        mov ax,table
                        mov ds,ax                                
                        mov dh,3                                ;dh代表行号(0~24)
                        mov dl,3                                ;dl代表列号(0~79)
                        mov al,160
                        mul dh                                        ;相乘得出行地址存在ax
                        mov bx,ax                                ;ax后面用到,转移到bx
                        mov al,2
                        mul dl                                        ;相乘得出列地址存在ax
                        add bx,ax                                ;行列相加得到真正地址,存放在bx
                        mov bp,0
                        mov cx,21
                        
                        
s1:                        push cx
                        push bx
                        mov ax,fruit 
                        mov es,ax
                        mov si,0
                        mov di,0
                        mov ax,0
                        mov dx,0
                        
                        mov ax,ds:[bp+di]                ;将年份放进目标段 
                        mov es:[si],ax
                        ;mov ax,ds:[bp+di].2 ;  我没有见过这种写法
                        ;mov es:[si].2,ax        
                        add si,6
                        add di,5
                        
                        
                        mov ax,ds:[bp+di]                ;将总金额放进目标段 
                        ;mov dx,ds:[bp+di].2        
                        call dtoc
                        add si,10
                        add di,5
                        
                        mov ax,ds:[bp+di]                ;将人数放进目标段 
                        mov dx,0
                        call dtoc
                        add si,6
                        add di,3
                        
                        mov ax,ds:[bp+di]                ;将人均金额放进目标段 
                        mov dx,0
                        call dtoc
                        
                        
;打印输出阶段                        
                        
                        mov ax,fruit                        ;段地址切换
                        mov ds,ax
                        mov ax,0b800h
                        mov es,ax
                        
                        mov si,0                                ;循环实现0转换为空格,并以0结尾
                        mov cx,29
a:                        push cx
                        mov cl,[si]                        
                        jcxz b
;不要用标号c                        
c1:                        inc si
                        pop cx
                        loop a
                        mov byte ptr [si],0
b:                        mov byte ptr [si],20h        
                        jmp short c1
                        
                        
                        mov si,0
                        call show_str
                        
                        
                        
                        
                        pop bx
                        pop cx
                        add bx,0a0h                                ;转移到下一行显存
                        add bp,0ah                                ;table段切换到下一行
                        loop s1

                        mov ax,4c00h
                        int 21h

                        
                        
                        
                        

dtoc:                push ax
                        push bx
                        push cx
                        push dx
                        push si
                        push di
                        mov di,0
                        mov cx,ax
                        jcxz short s3                        ;低位为0,跳转到s3判断
                        mov cx,0ah
s2:                        call divdw                                ;引用实验十(2)除法模块
                        add cx,30h
                        push cx                        
                        inc di
                        jmp short dtoc
s3:                        mov cx,dx
                        jcxz s4                                        ;高低位均位0,结束
                        jmp short s2 
s4:                        mov cx,di
s5:                        pop ax
                        mov es:[si],al
                        inc si
                        loop s5
                        pop        di
                        pop si
                        pop dx
                        pop cx
                        pop bx
                        pop ax
                        ret
        
        
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
;      (dx)=dword型数据的高16位;
;      (cx)=除数。
;返回:(dx)=结果的高16位;
;      (ax)=结果的低16位;
;      (cx)=余数。        
                
divdw:                push di
                        push ax                                ;ax后面做除法要用到,暂存到栈
                        mov ax,dx                        
                        mov dx,0                        ;被除数高位为0,低位为H
                        div cx
                        mov di,ax                        ;商暂存
                        pop ax                                ;取出L,此时高位为H/N的余数,低位为L
                        div cx
                        mov cx,dx                        ;余数
                        mov dx,di                        ;商高位
                        pop di
                        ret        
                        
        
show_str:        mov al,2
                        mov ch,0
                        
d1:                        mov cl,[si]
                        jcxz q
                        mov dl,ds:[si]
                        mov es:[bx],dl                        ;字符
                        ;mov es:[bx].1,al                ;颜色
                        inc si                                        ;存放顺序为倒序,自减一
                        add bx,2

                        loop d1
q:                        ret                                        
                        
                        
                

code ends

end start        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-22 09:52:28 | 显示全部楼层

可以帮忙看看我的代码哪里有错误吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-22 19:28:11 | 显示全部楼层
风在飘 发表于 2017-3-22 09:52
可以帮忙看看我的代码哪里有错误吗

可以先整理一下你的代码吗
你的代码太乱了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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