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
;
;
;终于做出效果来了!就是代码很多!:)
;
;
- [游客] 厉害,自己独立完成课设一,这本书就掌握多一半了。 10/24 16:23
- [tolearn] 嗯, 10/19 07:11
- [huang425618] 同学,检测10.5第二题你错了哦,ax的值是1哦,在 call dword ptr ss:[0]下 10/18 22:42
- [lk524849699] 这mov ax,4c00h int 21h 10/15 22:37
- [tolearn] 哪里? 10/15 22:29
- [lk524849699] 这不是有输出啊,还说不明白! 10/15 22:19
- [tolearn] 修改了一下 10/09 17:15
- [tolearn] 哦,对!谢谢提醒! 10/09 15:30
- [mess] 十六进制,别忘了写H。 10/09 15:11
- [mess] 等做了这章的实验,博主可以自己用debug验证下 ^_^ 10/09 15:10
- [tolearn] 最近学习比较紧,汇编进程就拉下来了 10/27 10:30
- [tolearn] 希望大家看完之后能够指点一二! 10/19 08:50
- [tolearn] 没人评论的日子我该怎么过…… 10/18 20:25
- [tolearn] 汇编,我已经感觉到你的强大了! 10/15 21:31
- [tolearn] 郁闷的网,检测到一半断线, 10/15 09:35
- [tolearn] 多实践,多思考,多看论坛。 牙好,胃好,身体倍棒! 10/11 20:13
- [tolearn] 汇编,值得去学习! 10/10 12:15
[ 游客 发表于 2010-10-24 16:23 ]
厉害,自己独立完成课设一,这本书就掌握多一半了。