汇编网首页登录博客注册
mouse的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  我要做些我能做的事情,不能老是睡下去了!
  • 『姓名』:;-)               
  • 『性别』:男    『发送消息
  • 个人说明:我的小老鼠;-)
  • 详细信息『加为好友』
学习动态

[2008-01-01 17:15] 第十章课设一

图片载入中
assume cs:code   

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 11542,14430,15257,17800 
data ends 

stack segment 
   db 32 dup(0) 
stack ends 

code segment   
 start:  
    mov ax,data  
    mov ds,ax  
    mov ax,stack 
    mov ss,ax 
    mov sp,32    ;栈存放计算后的数字 
 
;=================年份=================
    mov di,0 ;读取数据的起始位置
    mov bx,0 ;行数
    mov cx,21;循环次数
  dd_data0:
    push cx
    mov cx,4
    mov bp,0
  s0:
    mov ah,0
    mov al,ds:[di]
    mov [bp],ax
    inc bp
    inc di
    loop s0

    mov dh,2   ;起始行数
    add dh,bl  ;行数
    mov dl,23  ;23列
    mov cl,2   ;颜色
    call show_str
    
    pop cx
    inc bx
    loop dd_data0    
    
;=================收入=================
    mov di,84;读取数据的起始位置    
    mov bx,0 ;行数                  
    mov cx,21;循环次数              
  dd_data:
    push cx
    
    mov ax,[di]
    mov dx,[di+2]  ;赋值

    call dtoc  
    
    mov dh,2
    add dh,bl  
    mov dl,33  ;33列
    mov cl,2  
    call show_str
    
    pop cx
    add di,4    ;单位dd
    inc bx
    loop dd_data

;===============雇员=================
    mov di,168;读取数据的起始位置    
    mov bx,0  ;行数                  
    mov cx,21 ;循环次数              
  dd_data1:
    push cx
    
    mov dx,0  ;赋值,dx清零
    mov ax,[di] 
    call dtoc  

    mov dh,2
    add dh,bl  
    mov dl,43   ;43列 
    mov cl,2  
    call show_str
    
    pop cx
    add di,2  ;单位dw
    inc bx
    loop dd_data1

;===============平均数=================[84]/[168]
    mov di,84 ;读取被除数数据的起始位置
    mov si,168;读取除数数据的起始位置
    mov bx,0  ;行数                  
    mov cx,21 ;循环次数              
  dd_data2:
    push cx
    
    mov ax,[di]
    mov dx,[di+2]       ;赋值
    div word ptr [si]   ;被除数
    mov dx,0                ;得到结果,转换输出
    call dtoc  
   
    mov dh,2
    add dh,bl  
    mov dl,53  ;53列
    mov cl,2  
    call show_str
    
    pop cx
    add di,4    ;单位dd
    add si,2    ;单位dw
    inc bx
    loop dd_data2

           
    mov ax,4c00h  
    int 21h  
    
;数值显示---------------  
 dtoc:  
    push ax  
    push bx  
    push cx  
    push dx  
    push si 
    push bp  

    mov si,0  
 s1:  
    mov cx,10
    call divdw  
    add cx,30h  
    push cx 
    add si,1            ;结果的数字个数  
    mov cx,ax         
    jcxz ok     
    jmp s1  

  ok:  
    mov bp,0            ;指向ds 
    mov cx,si                 ;数字个数 
  s2: 
    pop ax 
    mov [bp],al    ;存到ds段内,用于调用显示子程序显示 
    inc bp 
    loop s2 
    mov byte ptr [bp],0
     
    pop bp 
    pop si  
    pop dx  
    pop cx  
    pop bx  
    pop ax  
    ret  
    
;除法子程序---------------     
    ;参数: ax被除数低16位,dx被除数高16位,cx除数 
    ;返回: ax被除数低16位,dx被除数高16位,cx余数
 divdw:   
    push si  
    push di 
         
    mov di,ax                      ;将低16位ax暂存于bx   
    mov ax,dx                      ;将高16位进行除法运算  
    mov dx,0           
    div cx  
    mov si,ax                      ;将int(H/N)暂存于si 
 
    mov ax,di                      ;把低16位除法转换,此时dx存放的是高十六位除法时的余数  
    div cx           
    mov cx,dx                      ;将最终余数给cx     
    mov dx,si                      ;将结果高16位传dx,第十六位的除法商默认在ax中       
      
    pop di 
    pop si  
    ret  


;显示子函数--------------  
show_str:  
    push ax                   ;用al暂存颜色(cl中传递过来)  
    push bx                   ;存放行列计算后得到的显存起始地址[0~0f9f可以存放在一个16位寄存器中]  
    push cx                   ;jcxz使用  
    push bp             ;指向字符串变量  
      
    mov ax,0b800h   
    mov es,ax           ;定义显存段起始段地址      
    mov al,160   
    mul dh               
    mov bx,ax              
    mov al,2   
    mul dl  
    add bx,ax           ;算出显示地址
    
    mov bp,0                    ;指向字符第一个位置
    mov al,cl           ;将字符属性存于al中    
   s:   
    mov ch,0   
    mov cl,[bp]   
    jcxz return         ;判断字符为0时结束   
    mov ch,al  
    mov es:[bx],cx  
    add bp,1   
    add bx,2  
    jmp s   
     
return:  
    pop bp   
    pop cx   
    pop bx   
    pop ax   
    ret                             ;返回主程序   

code ends   
end start
评论次数(4)  |  浏览次数(1063)  |  类型(汇编作业) |  收藏此文  | 

[  mess   发表于  2008-01-01 17:53  ]

看不懂,路过~~

[  cxn   发表于  2008-01-01 19:31  ]

good 顶一下

[  ltp1234   发表于  2012-04-08 23:48  ]

写的很好!!

[  ltp1234   发表于  2012-04-09 01:58  ]

push cx  
    add si,1            ;结果的数字个数   
    mov cx,ax          
    jcxz ok      
我绝地这个地方不够严谨,因为除法调用以后ax,dx存放着除数,只有ax和dx同时等于0,才能表示数据除尽,才能将每位转换为字符,然后再进行到相应的字符地址空间。求解惑。。。。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码