|
主题 : : 课设1编译成功,思路很清晰啊! [待解决] |
回复[ 1次 ]
点击[ 429次 ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-13 21:26 |
assume cs:code,ds:data,ss:stack
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
dd 5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
db 10 dup (0)
data ends
stack segment
dw 20h dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,40h
mov di,0 ;ds:di年份,收入dword型数据的地址
mov bx,0 ;ds:bx指向人数word型数据
mov si,210 ;存放分解数据的地方,也是显示数据的所在地
mov dh,3 ;显示的行数
mov cx,21 ;共21组数据
m: push cx
push dx
;显示年份
mov ax,[di] ;低位给ax
mov [si],ax
mov dx,[di+2] ;高位给dx
mov [si+2],dx
mov byte ptr [si+4],0
pop dx
mov dl,33
mov cl,2
call show_str
;显示收入
push dx
mov ax,[di+84]
mov dx,[di+84+2]
call dtoc
pop dx
mov dl,48
mov cl,2
call show_str
;显示人数
push dx
mov ax,[bx+168]
mov dx,0
call dtoc
pop dx
mov dl,60
mov cl,2
call show_str
;显示人均收入
push dx
mov ax,[di+84]
mov dx,[di+84+2]
div word ptr [bx+168]
mov dx,0
call dtoc
pop dx
mov dl,75
mov cl,2
call show_str
inc dh ;显示到下一行
add di,4 ;指向下一组数据
add bx,2
pop cx
loop m
mov ax,4c00h
int 21h
;名称:dtoc
;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=dword型数据的低16位
;(dx)=dword型数据的高16位
;ds:si指向字符串的首地址
;返回:无
dtoc: push bx ;寄存器入栈
push cx
push dx
push si
mov bx,0 ;bx计数
s2: mov cx,10 ;除数
call divdw
add cx,30h ;十进制数据加30H
push cx ;数据入栈
inc bx ;计数器加1
mov cx,dx;判断商的高位是否为0
jcxz s0 ;为0判断低位
jmp short s2 ;不为0接着除
s0: mov cx,ax ;判断低位是否为0
jcxz s1 ;为零,数据分解完,放到指定地点,ds:si
jmp short s2 ;不为0接着除
s1: mov cx,bx ;计数值给cx,把在栈中的数据放到指定地点
s3: pop bx
mov [si],bl
inc si
loop s3
mov byte ptr [si],0
pop si
pop dx
pop cx
pop bx
ret
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型, ;结果为dword型
;参数:(ax)=dword型数据的低16位
;(dx)=dword型数据的高16位
;(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
;(cx)=余数
;
divdw: push bx ;bx应该入栈
push ax
mov ax,dx ;计算H/N
mov dx,0
div cx
;此时int(H/N)在ax中,ren(H/N)在dx
mov bx,ax ;将int(H/N)存在bx中
pop ax ;此时dx=ren(H/N),ax=L
div cx ;此时ax=低16位值,dx=余数
mov cx,dx ;余数给cx
mov dx,bx ;高16位给dx
pop bx
ret
;名称:show_str
;功能:在指定的位置ds:si,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
;返回:无
show_str:
push ax
push es
push dx ;寄存器入栈
push bx
push si
mov ax,0b800h ;指向显存
mov es,ax
mov al,160
dec dh ;定位行,因为屏幕行数从0开始,所以减1
mul dh
mov bx,ax
mov al,2
dec dl ;定位列,因为屏幕列数从0开始,所以减1
mul dl
add bx,ax ;最后屏幕位置定义在bx中
mov ah,cl
str: mov cl,ds:[si]
mov ch,0
jcxz ok ;判断是否为0
mov es:[bx],cl ;放入字符
mov es:[bx+1],ah ;放入颜色值
inc si
add bx,2
jmp short str
ok: ;为0返回
pop si
pop bx
pop dx
pop es
pop ax
ret
code ends
end start | | |