风在飘 发表于 2017-3-21 20:12:56

急,课程设计一竟然我写处了17处错误!!!

编写程序为王爽老师的《汇编语言》第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,               
            mov es:,ax
            mov ax,            
            mov es:,ax   
            
            mov ax,
            mov es:,ax
            mov dx,
            mov es:,dx
            
            div word ptr
            mov es:,ax
            
            mov ax,
            mov es:,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:      ;将年份放进目标段
            mov es:,ax
            mov ax,ds:.2
            mov es:.2,ax   
            add si,6
            add di,5
            
            
            mov ax,ds:      ;将总金额放进目标段
            mov dx,ds:.2   
            call dtoc
            add si,10
            add di,5
            
            mov ax,ds:      ;将人数放进目标段
            mov dx,0
            call dtoc
            add si,6
            add di,3
            
            mov ax,ds:      ;将人均金额放进目标段
            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,            
            jcxz b
c:            inc si
            pop cx
            loop a
            mov byte ptr ,0
b:            mov byte ptr ,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:,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,
            jcxz q
            mov dl,ds:
            mov es:,dl            ;字符
            mov es:.1,al      ;颜色
            inc si                  ;存放顺序为倒序,自减一
            add bx,2

            loop d1
q:            ret                  
            
            
      

code ends

end start   



风在飘 发表于 2017-3-21 20:14:12

{:5_107:}求各位大佬帮帮吗!!!

人造人 发表于 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,                               
                        mov es:,ax
                        mov ax,                       
                        mov es:,ax       
                       
                        mov ax,
                        mov es:,ax
                        mov dx,
                        mov es:,dx
                       
                        div word ptr
                        mov es:,ax
                       
                        mov ax,
                        mov es:,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:                ;将年份放进目标段
                        mov es:,ax
                        ;mov ax,ds:.2 ;我没有见过这种写法
                        ;mov es:.2,ax       
                        add si,6
                        add di,5
                       
                       
                        mov ax,ds:                ;将总金额放进目标段
                        ;mov dx,ds:.2       
                        call dtoc
                        add si,10
                        add di,5
                       
                        mov ax,ds:                ;将人数放进目标段
                        mov dx,0
                        call dtoc
                        add si,6
                        add di,3
                       
                        mov ax,ds:                ;将人均金额放进目标段
                        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,                       
                        jcxz b
;不要用标号c                       
c1:                        inc si
                        pop cx
                        loop a
                        mov byte ptr ,0
b:                        mov byte ptr ,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:,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,
                        jcxz q
                        mov dl,ds:
                        mov es:,dl                        ;字符
                        ;mov es:.1,al                ;颜色
                        inc si                                        ;存放顺序为倒序,自减一
                        add bx,2

                        loop d1
q:                        ret                                       
                       
                       
               

code ends

end start       

风在飘 发表于 2017-3-22 09:52:28

人造人 发表于 2017-3-21 20:38


可以帮忙看看我的代码哪里有错误吗

人造人 发表于 2017-3-22 19:28:11

风在飘 发表于 2017-3-22 09:52
可以帮忙看看我的代码哪里有错误吗

可以先整理一下你的代码吗
你的代码太乱了
页: [1]
查看完整版本: 急,课程设计一竟然我写处了17处错误!!!