a373994379 发表于 2012-9-22 15:43:45

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

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,          ;取出总收入低位,放到第ax,做被除数
               mov dx,      ;取出总收入高位,放到第dx,做被除数
               mov bx,          ;取出人数,到bx做除数
               div bx               ;做32位除法,结果在ax中,余数在dx中
               mov es:,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:    ;    被除数为ax低
            mov dx,ds:        ;        被除数为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:为字符串存储位置,
   dd_s_str:pop ax         
                  mov ds:,al
                  inc bx
                  loop dd_s_str   ; 返回值di为字符串长,这一段把得到的字符串存入ds:起始地址的内存单元中
                       
               ;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:;取出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:,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:
                   mov byte ptr es:,ah
                           inc di
                           mov byte ptr es:,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

baby520 发表于 2013-10-10 20:49:17

哇。。。那么长。。。

tsembrace 发表于 2013-10-10 21:30:29

做出来就好~

zjjsfny 发表于 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,
        mov es:,ax
        mov ax,
        mov es:,ax
       
       
        mov ax,
        mov es:,ax
        mov ax,
        mov es:,ax
       
       
        mov ax,
        mov es:,ax

    mov ax,
        mov dx,
        div word ptr
    mov es:,ax
        add bx,4
        add si,2
        add di,16
       
           loop s
        code ends
       
        end start

我的是这样的。

福禄娃娃 发表于 2013-10-11 22:58:20

没事,做出来了就行。
页: [1]
查看完整版本: 课程设计1做了2天,快疯了,感觉还是不咋地