鱼C论坛

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

王爽课程设计1,检查一下午了实在是没有办法了,求大神点明错误

[复制链接]
发表于 2017-2-19 20:47:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 adong 于 2017-2-19 20:48 编辑

已经确实没有办法了,大神麻烦帮忙调试下吧,万分感谢,代码如下


assume cs:codesg,ds:data,ss:stack

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 16 dup (0)
table ends

stack segment
  db 32 dup(0)
stack ends

codesg segment

; 思路:年份直接写入数据段
; 收入和雇员转化ASCII后入栈,然后写入数据段
; 人均收入用无溢出除法后转化ASCII后,入栈写入数据段

; 最后把数据段内容写入显示器
; 然后上述步骤重复21次
start: mov ax,data
       mov ds,ax
           mov ax,table
           mov es,ax     ;es只能用在外循环,子程序要用es需要入栈
           mov ax,stack
           mov ss,ax
           mov sp,32      
           
           mov cx,21      ;外循环次数
           mov dh,0       ;每次循环的行数
           mov bx,0       ;bx表示每次循环的每个年份或收入 ,每次大循坏开始要加4
           mov si,0       ;表示人员

first_loop:  
      
           push cx        ;每次大循坏开始要减1
           push dx
                                       
           mov ax,[bx]
           mov es:[bx],ax
           mov ax,[bx+2]
           mov es:[bx+2],ax
           
          ; dx 做为每次循环的参数 ,子程序要入栈,每次循环dh加1
;显示数据        
         
       pop dx
           mov dl,0
           mov cl,2
           call show_str

;收入和雇员转化ASCII后入栈,然后写入数据段
; 需要个ASCII转化子程序dtoc
;收入数和年份一样的字节数,可以和年份一样用bx定列地址
;显示收入           

       push dx
              mov ax,[bx+84]     ;低位字节
           mov dx,[bx+86]    ;高位字节

           call dtoc
           pop dx

           mov dl,20
           mov cl,2           
           call show_str  

;显示雇员

           push dx
              mov ax,[si+168]    ;低位字节
           mov dx,0            ;高位字节
           
           call dtoc
           
           pop dx

           mov dl,40
           mov cl,2           
           call show_str  
           
;计算平均数并显示
       push dx
              mov ax,[bx+84]     ;低位字节
           mov dx,[bx+86]     ;高位字节
              mov cx,[si+168]
           call divdw
           call dtoc
           pop dx
           
           mov dl,60
           mov cl,2           
           call show_str   
                     
           add bx,4
           add si,2
           inc bh
           pop cx
           
           loop first_loop
           
           mov ax,4c00h
       int 21h



dtoc:     ;用cx存储商,做判断,余数存在data段
         push si
                 push ds
                 push bx
                 
                 mov bx,table
                 mov ds,bx
                 
                 mov si,0
         mov cx,10                 
                 
    s1:
             jcxz ok1
                 mov cx,10
                 call divdw
                 
                 add cx,30h
                 push cx
                 mov cx,ax
                 inc si
                 jmp s1
                 
        ok1: mov cx,si
             mov si,0
            
    ok2: pop bx
                 mov [si],bx
                 inc si
                 loop ok2
                 
         pop bx
                 pop ds
                 pop si
                 
                 ret
               
divdw:   push bx   ;无溢出除法后dx为最高位,ax为低位,cx为余数
         push ax
         
         mov ax,dx
                 mov dx,0
         div cx
                 
         mov bx,ax
                 
         pop ax
         div cx
         mov cx,dx
                 mov dx,bx
                 
                 pop bx
                 ret         

show_str:       ;显示table段数据 dh行 dl列 cl 颜色
          push ax
         push bx
         push si
         push es
         push di
         push ds
         
         mov ax,0b800h
         mov es,ax
         
         mov ax,table
         mov ds,ax
         
         mov ax,160
         mul dh
         mov si,ax ;行偏移地址
         
         mov ax,2
         mul dl
         mov bx,ax ;行列地址
         
         mov al,cl
         mov di,0
         mov ch,0
         
s:         mov cl,[di]

         jcxz ok
         
         mov es:[bx+si],cl
         mov es:[bx+si+1],al
         
         inc di
         add bx,2
         jmp s
         
ok:         
     pop ds
         pop di
     pop es
     pop si
         pop bx
         pop ax
         
         ret                 

codesg ends
end start

最后的实现的图形

最后的实现的图形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-20 22:54:14 | 显示全部楼层
assume cs:code,ds:data,ss:stack,ds: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',0,0,0,0,0,0,0,0,0,0,0,0
   
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000,0,0,0
   
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800,0,0,0
   
data ends   

stack segment
      db 16 dup (0)
           
stack ends      
   
table segment

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

code segment
  
      start: ;初始化寄存器
           mov ax,stack              ;定义栈段
           mov ss,ax         
           mov sp,0fh

           mov ax,data               ;定义数据段
           mov ds,ax

           mov ax,table               ;定义表格数据段
           mov es,ax  
          
           mov bx,0
           mov di,0
           mov si,0
           mov bp,0
          
            mov cx,21                 ;循环21次
            
         s:;循环程序
            
          ;复制年份
            push ds:[0][si]           ;ds段数据进栈
            push ds:[2][si]
            pop es:[2][di]            ;出栈ds段数据到es单元
            pop es:[0][di]
            
          ;复制收入
            push ds:[060h][si]
            push ds:[062h][si]
            pop es:[07h][di]
            pop es:[05h][di]
            
          ;复制人数
            push ds:[0c0h][bp]
            pop es:[0ah][di]
            
          ;计算人均收入
            mov dx,es:[7h][di]        ;把高位数据读入dx中
            mov ax,es:[5h][di]        ;把低16位数据读入ax中      
            div word ptr es:[0ah][di] ;被除数为16位,除数为32位,高16位在dx存放,低16位在ax存放
            mov es:[0dh][di],ax       ;被除数为16位,商默认在ax中存放,余数在dx中存放
                                      ;如果除数为8位,被除数为16位,默认在ax中存放,除法完成商在al存放,余数在ah中存放
            
            add si,4
            add di,10h                ;10h指向下一行
            add bp,2
            
          loop s
          
             
           mov ax,4c00H
         int 21H
  
code ends

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 12:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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