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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2010-10-20 17:49] 课程设计1

assume cs:code

sdata segment
db 32 dup(0)
sdata ends

stack segment
dw 64 dup(0)
stack ends

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

data segment  
db '1975','1976','1977','1978','1979','1980','1981','1982' 
db '1983','1984','1985','1986','1987','1988','1989','1990' 
db '1991','1992','1993','1994','1995' 
;以上是表示21年的21个字符串 ds-10H:0--21*4-1 
dd 16,22,382,1356,2390,8000,16000,24486 
dd 50065,97479,140417,197514,345980,590827,803530,1183000 
dd 1843000,2759000,3753000,4649000,5937000 
;以上是表示21年公司总收入的21个dword型数据 ds-10H:21*4 21*8 
dw 3,7,9,13,28,38,130,220 
dw 476,778,1001,1442,2258,2793,4037,5635 
dw 8226,11542,14430,15257,17800 
;以上是表示21年公司雇员人数的21个word型数据 
data ends 

;说明:将data段中的数据以十进制形式显示出来。
;参数:ds:si指向sdata的首地址
;结果:显示字符串
code segment
start:  mov ax,sdata
        mov ds,ax
        mov si,0
        
        mov ax,stack
        mov ss,ax
        mov sp,080H
        
        mov ax,0b800h
        mov es,ax
        mov bp,0
        ;
        ;调用子程序totable
        call far ptr  totable
        ;往b800:0写入数据。
        mov cx,21
        mov di,0a0h
        mov bp,0
        ;
        ;直接写入年份
  year: push cx
        mov ax,[di]
        mov [si],ax
        mov ax,[di].2h
        mov [si].2h,ax
        push di
        mov dh,2
        mov dl,2
        mov cl,2
        ;
        call far ptr showstr
        sub bp,di
        add bp,0a0h
        pop di
        add di,10h
        pop cx
        loop year
        ;写入收入
        mov cx,21
        mov di,0a0h
        mov bp,0
 income:push cx                
        mov ax,[di].5h
        mov dx,[di].7h
        call far ptr dtoc
        push di
        mov dh,2
        mov dl,20
        mov cl,4
        ;
        call far ptr showstr
        sub bp,di
        add bp,0a0h
        pop di
        add di,10h
        pop cx
        loop income
        ;写入人数
        mov cx,21
        mov di,0a0h
        mov bp,0
noperson:
        push cx                
        mov ax,[di].0ah
        mov dx,0
        call far ptr dtoc
        push di
        mov dh,2
        mov dl,40
        mov cl,4
        ;
        call far ptr showstr
        sub bp,di
        add bp,0a0h
        pop di
        add di,10h
        pop cx
        loop noperson
        ;写入人均收入
        mov cx,21
        mov di,0a0h
        mov bp,0
average:
        push cx                
        mov ax,[di].0ch
        mov dx,[di].0eh
        call far ptr dtoc
        push di
        mov dh,2
        mov dl,60
        mov cl,4
        ;
        call far ptr showstr
        sub bp,di
        add bp,0a0h
        pop di
        add di,10h
        pop cx
        loop average
;--------------------------
        mov ax,4c00h
        int 21h
;----totable子程序        ----
;说明:将data段中的数据处理一下,保存在table中。
;参数:ds:si指向table的首地址
;返回:无
totable:;备份寄存器
        push ax
        push ds
        push bx
        push si
        push di
        push cx
        ;
        mov ax,table
        mov ds,ax
        mov bx,0
        mov si,0
        mov di,150H
        mov cx,21
        ;写入年份、收入和雇员人数
writein:push cx
        ;写入年份
        mov ax,[bx].[di]
        mov [si],ax
        mov ax,[bx].2H[di]
        mov [si].2h,ax
        ;写入收入
        mov ax,[bx].54h[di]
        mov [si].5h,ax
        mov ax,[bx].56h[di]
        mov [si].7h,ax
        ;写入雇员人数
        mov ax,[di].0a8h
        mov [si].0ah,ax
        ;计算人均收入
        mov ax,[si].5h
        mov dx,[si].7h
        mov cx,[si].0ah
        call far ptr divdw
        ;
        mov word ptr [si].0ch,ax
        mov word ptr [si].0eh,dx
        add si,10h
        add bx,2
        add di,2
        pop cx
        loop short writein
        ;还原寄存器
        pop cx
        pop di
        pop si
        pop bx
        pop ds
        pop ax
        ;
        retf
;----divdw子程序                ----
;说明:进行不会产生溢出的除尘运算,被除数为dword型,除数为word型。
;参数: (ax)=dword型数据的低16位
;       (dx)=dword型数据的高16位        
;        (cx)=除数
;返回:        (dx)=结果的高16位,
;        (ax)=结果的低16位,        
;         (cx)=余数
divdw:  push bx
        ;
        push ax
        mov ax,dx
        sub dx,dx        
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        ;
        pop bx
        retf
;----        dtoc子程序        ----
;说明:        将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:        (ax)=dword型数据的低16位
;       (dx)=dword型数据的高16位        
;返回:        无
dtoc:        ;备份寄存器
        push ax
        push bx
        push cx
        push dx
        push di
        push si

        ;利用取余数得到十进制各位数值,再加上30H得到其对的字符ASCII码。
        ;再利用栈倒转其顺序。
        
        mov si,0
        mov di,0
trans:  mov cx,0ah
        ;
        call far ptr divdw
        add cx,30h
        push cx
        inc di                ;获得入栈数目
        push ax
        or ax,dx
        mov cx,ax 
        pop ax
        jcxz take
        jmp short trans

take:   mov cx,di        ;判断入栈数目
        jcxz outpop
        pop ax
        mov byte ptr [si],al
        dec di
        inc si         
        jmp short take
outpop:        ;还原寄存器
        pop si
        pop di        
        pop dx
        pop cx
        pop bx
        pop ax
        ;
        retf
;----        showstr子程序        ---- 
;说明:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围[0,24]),(dl)=行号(取值范围[0,79]),
;      (cl)=颜色,ds:si指向字符串的首地址         
;返回:bp的增值
showstr:;备份寄存器
        push ax
        push es
        push dx
        push cx
        push si
        push bx
        ;
        mov di,0
        mov si,0
        mov bl,cl
        mov cx,bp
        jcxz init
        jmp on
  init: mov ax,160        ;一行有160个内存单元
        mul dh
        mov bp,ax        ;获得指定行偏移地址
        add dl,dl        ;获得指定列偏移地址
        sub dh,dh        ;置dh为0
        add bp,dx        ;综合行列偏移地址
        
        ;
  on:   mov ah,bl        ;获得指定颜色
        mov cx,[si]
        jcxz clear
        mov al,cl        ;获得字符
        mov es:[bp],ax
        inc si
        add bp,2
        add di,2        ;与bp同位
        jmp short on
        ;清空内存单元
 clear: dec si
        mov cl,[si]
        jcxz outshow
        sub [si],cl
        jmp short clear 
outshow:;还原寄存器
        pop bx
        pop si
        pop cx
        pop dx
        pop es
        pop ax
        ;
        retf
;-------------------------------
code ends
end start
;
;
;终于做出效果来了!就是代码很多!:)
;
;
评论次数(1)  |  浏览次数(1078)  |  类型(汇编作业) |  收藏此文  | 

[  游客   发表于  2010-10-24 16:23  ]

厉害,自己独立完成课设一,这本书就掌握多一半了。

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