鱼C论坛

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

课程设计1做了2天,快疯了,感觉还是不咋地

[复制链接]
发表于 2012-9-22 15:43:45 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code,ds:data,ss:stack

stack segment
   dd 100 dup (0)
stack ends

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' ;以上21个字符串表示21年  共站位84字,起始地址0,每一年偏移4
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
     ;以上表示21年公司总收入                    共站位84字节节,起始地址84=54h,每一年偏移4
  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  dw 11542,14430,15257,17800 ;以上表示21年公司雇员人数    共站位42字节,起始地址为168=0a8h,每年偏移2
data ends

table segment
dd 20 dup (0)
table ends

code segment
start:  mov ax,stack
         mov ss,ax
                 mov sp,400   ;ds指向data段
                 
                 mov ax,table
                 mov es,ax   ;es指向table段,用来存储平均收入
                 
                 
                 mov bp,0 ;索引平均收入         
                 mov ax,data
                 mov ds,ax
                 mov bx,0  ;用来索引年份
                 mov di,84  ; 索引总收入
                 mov si,168  ;索引人数,和平均收入
                 
                 mov dh,3  ;从第4行开始显示 4-23行
                 mov cx,21 ;控制循环次数21
        s :  push cx
             mov dl,10    ;从第11列开始显示
                 mov cl,7
                 mov ch,4
         call show_string ;以上显示年份
            
                 push bx
                 add dl,10
             mov bx,di         ;di=bx指向总收入
                 call show_dd_num   ;显示总收入
                 pop bx
         
                 push bx
                 add dl,15
                 mov bx,si      ;bx=si指向人数
                 call show_dw_num  ;显示人数
                 pop bx   
                 
         ;计算平均收入,存入es:si
         push bx
         push ds
         push dx                 
                 mov ax,[di]          ;取出总收入低位,放到第ax,做被除数
                 mov dx,[di+2]        ;取出总收入高位,放到第dx,做被除数
                 mov bx,[si]          ;取出人数,到bx做除数
                 div bx               ;做32位除法,结果在ax中,余数在dx中
                 mov es:[bp],ax       ;;把结果ax先放es:bp中
                 pop dx              ;取出dh行号,dl列号
         mov ax,table
             mov ds,ax            ;ds指向table ds:bp指向总收入
                 mov bx,bp            ;ds:bx指向平均收入,以便于调用show_dw_num
                 add dl,11
                 call show_dw_num     ;调用函数。显示平均收入
                 pop ax
                 mov ds,ax  ;恢复ds的值
                 pop bx
                 
                 inc dh
                 add bp,2
                 add si,2
                 add bx,4
                 add di,4
         pop cx
                 loop s  
                  
                 mov ax,4c00h
                 int 21h
                 
show_dd_num:push ax      ;把一个dd数值以十进制字符串形式显示在屏幕指定位置dh=行号,dl=列号,cl=颜色属性,ds:bx指向该数值的地址,没有返回值
                 push bx
                 push bp
                 push di
                 push si
                 push ds
                 push es
                 push cx
                 push dx


                ;内存单元中ds:bx指向这个字型整数,
                    mov ax,ds:[bx]    ;    被除数为ax低
            mov dx,ds:[bx+2]        ;        被除数为dx高位   
                    mov di,0     ;这一段取出dword值,;内存单元中ds:bx指向这个字型整数,di存放字符串长度

dd_mod_g:  mov cx,10    ;cx除数
            mov bx,ax             
                mov ax,dx
                    mov dx,0
                    div cx
                    push ax   ;高位商推入占空间
                    mov ax,bx
                    div cx    ;获得低位商放入ax中
                    mov cx,dx
                    pop dx    ;这一段做dword数值除法,被除数为ax低位,dx高位,cx为除数。返回值dx=结果高位,ax=结果低位,cx=余数
                                                
                        inc di
                    add cl,30h
                    push cx  
                        mov cx,dx
                        inc cx
                        loop dd_mod_g ;判断高位结果,若为0向下执行 不为0直接loop
                    mov cx,ax
                    jcxz dd_mod_ok  ;判断低位结果
                    jmp short dd_mod_g         
dd_mod_ok: mov cx,di        ;这一段计算dword/10的所有余数推入占空间,并计数余数个数di(即为得到的字符串长度)

             mov ax,stack
                         mov ds,ax
                         mov bx,0   ;ds:[0]为字符串存储位置,
   dd_s_str:pop ax         
                    mov ds:[bx],al
                    inc bx
                    loop dd_s_str   ; 返回值di为字符串长,这一段把得到的字符串存入ds:[0]起始地址的内存单元中
                       
               ;dh行号,dl列号,cl颜色,ds:0为起始地址,di字符串长度,没有返回值
                           pop dx
                           pop cx  ;取出dx,cx得到dh行号,dl列号,cl颜色
                           push cx
                           push dx ;恢复初始化
                           mov bx,di
                           mov ch,bl ;把di的值放到ch中 调用show_string
                           mov bx,0 ;ds:bx指向这个字符串
                           call show_string  ;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值

         pop dx
                 pop cx
                 pop ax
                 mov es,ax
                 pop ax
                 mov ds,ax
                 pop si
                 pop di
                 pop bp
                 pop bx
                 pop ax         
                 ret
          
          
show_dw_num:push ax      ;把一个dw数值以十进制字符串 形式显示在屏幕指定位置dh=行号,dl=列号,cl=颜色属性,ds:bx指向该数值的地址,没有返回值
                 push bx
                 push bp
                 push di
                 push si
                 push ds
                 push es
                 push cx
                 push dx
               
                mov ax,ds:[bx]  ;取出dw数值 ,32位除法的低位被除数ax
                    mov bx,10    ;除数
                    mov di,0        ;di为存放字符串长度
dw_mod_s:  mov dx,0   ;做32位除法,被除数高位为dx=0
                    div bx       ;做除法,ax为结果,dx为余数
                        inc di
                    add dl,30h
                    push dx  
                    mov cx,ax
                    jcxz dw_mod_ok
                    jmp short dw_mod_s          ;这一段做除法得到的余数推入栈空间中,得到di为字符串长度       
                       
dw_mod_ok:  mov ax,stack
                         mov ds,ax
             mov bx,0    ;把ds:0作为字符串的存储空间         
                     mov cx,di      ;di控制循环
    s_dw_str:pop ax
                     mov ds:[bx],al
                     inc bx
                     loop s_dw_str    ;这一段把得到的字符串存入ds:0中,长度为di
                 
                       pop dx
                           pop cx  ;取出dh行号,dl列号,cl颜色
                           push cx
                           push dx  ;恢复初始化
                           mov bx,di ;把di的值放到ch中 调用show_string
                           mov ch,bl
                           mov bx,0 ;ds:bx指向这个字符串
                           call show_string  ;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值
                          
         pop dx
                 pop cx
                 pop ax
                 mov es,ax
                 pop ax
                 mov ds,ax
                 pop si
                 pop di
                 pop bp
                 pop bx
                 pop ax         
                 ret
                  
            
                 
  ;将一个已知长度字符串在屏幕的指定位置显示出来,
  ;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值
  show_string: push ax  ;
               push bx
                           push cx
                           push di
                           push bp
                           push es
                          
               mov bp,bx
               mov al,0a0h
                           mul dh
                           mov bx,ax
                           mov al,2
                           mul dl
                           add bx,ax  ;便宜地址
                           mov ax,0b800h
               mov es,ax  ;把显示位置的起始地址放入es中
                          

                           mov al,cl  ;颜色放入al中
                           mov cl,ch
                           mov ch,0  ;cx控制循环次数
                           mov di,0
      s_show:  mov ah,ds:[bp]  
                   mov byte ptr es:[bx+di],ah
                           inc di
                           mov byte ptr es:[bx+di],al
                           inc di
                           inc bp
                           loop s_show       
                          
                           pop ax
               mov es,ax
               pop bp                          
                           pop di
                           pop cx
                           pop bx
                           pop ax              
                   ret
                          

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-10-10 20:49:17 | 显示全部楼层
哇。。。那么长。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-10 21:30:29 | 显示全部楼层
做出来就好~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-11 10:15:16 | 显示全部楼层
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,2794,4037,5636,8226
        dw 11542,14430,15257,17800
       
        data ends
       
        table segment
       
        db 21 dup('year summ ne ?? ')
        table ends
       
        code segment
start:
    mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov cx,21
        mov bx,0
        mov si,0
        mov di,0
s:        mov ax,[bx]
        mov es:[di],ax
        mov ax,[bx+2]
        mov es:[di+2],ax
       
       
        mov ax,[bx+54h]
        mov es:[di+5h],ax
        mov ax,[bx+56h]
        mov es:[di+7h],ax
       
       
        mov ax,[si+0a8h]
        mov es:[di+0ah],ax

    mov ax,[bx+54h]
        mov dx,[bx+56h]
        div word ptr [si+0a8h]
    mov es:[di+0dh],ax
        add bx,4
        add si,2
        add di,16
       
           loop s
        code ends
       
        end start

我的是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-11 22:58:20 | 显示全部楼层
没事,做出来了就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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