|
发表于 2012-3-10 15:49:02
|
显示全部楼层
本帖最后由 顺qi吇繎 于 2012-3-10 16:14 编辑
assume cs:codesg
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个字符串 0-53H
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 234980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据 054H-0A7H
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据 0A8H-0D1H
data ends
stack segment
dw 20 dup(0)
stack ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,40
mov dh,2 ;显示 行
mov cx,21
mov di,0
mov bx,0
s: push cx
mov cx,4
mov dl,24 ;列
s1: mov al,[di] ;读取年份 存入ax
mov ah,0
inc dl
call show_str
inc di
loop s1
mov dl,35 ;列
push dx
mov si,0
mov ax,ds:[50h+di] ;读取公司总收入的低16位 存入ax
mov dx,ds:[52h+di] ;读取公司总收入的高16位 存入dx
call dtoc ;将数字转换成10进制形式的字符串格式,并显示
add sp,2
mov dl,45 ;列
push dx
mov si,0
mov dx,0
mov ax,ds:[0a8h+bx] ;读取雇用人数存入ax
call dtoc ;显示人数
add sp,2
mov dl,55 ;列
push dx
mov si,0
mov ax,ds:[50h+di] ;读取公司总收入的低16位 存入ax
mov dx,ds:[52h+di] ;读取公司总收入的高16位 存入dx
div word ptr ds:[0a8h+bx] ;算出人均收入,结果存入ax
mov dx,0
call dtoc ;显示平均收入
add sp,2
inc dh ;行数+1
add bx,2
pop cx
loop s
mov ax,4c00h
int 21h
dtoc:
mov cx,0ah
call divdw
add cx,30h ;将cx(余数)+30h 转换为该数字的ASCII码的对应字符 0对30H 1对31H...9对39H
push cx ;利用压栈出栈的逆序原理,将最多10个字符串逆序排列
inc si
mov cx,ax ;将商放入CX并判断是否为0,为0则该数已经被分解完成,否则继续分解.
jcxz okax
jmp short dtoc
okax:mov cx,dx ;低16位 ax的值为0时,转到这里判断DX的值是否为0
jcxz okdx ;如果dx也为0,则跳到结束.
jmp dtoc ;如果dx不为0,返回去继续取余数
okdx:mov cx,si ;将压入的字符个数送入CX,来调整POP次数
mov dx, word ptr ss:[36] ;行dh 列dl
s2:pop ax
call show_str
inc dl
loop s2
ret
divdw: push di ;此处为不溢出除法
mov di,ax
mov ax,dx
mov dx,0
div cx
xchg di,ax
div cx
mov cx,dx
mov dx,di
pop di
ret
show_str:
push bx
push ax
mov al,dh ;以下将 ((行数-1)*160 + b8000H)/16 = 段地址ES
dec al
mov bl,0ah
mul bl
add ax,0b800h
mov es,ax
;以下将(列数-1)*2 转换为本行的偏移字节数 存放在bx中
mov al,dl
dec al
mov bl,2
mul bl
mov bx,ax
pop ax
mov byte ptr es:[bx],al ;偶数位存放字符 闪烁 背景 高亮 前景
mov byte ptr es:[bx+1],7 ;奇数位存放颜色. 0 000 0 111 为黑底白字
pop bx
ret
codesg ends
end start
|
评分
-
查看全部评分
|