|
主题 : : 课程设计1,求找茬 [待解决] |
回复[ 0次 ]
点击[ 400次 ] | |
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29 |
assume cs:code,ds:data
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个字符串0000h
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型数据0054h
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型数据00a8h
db 16 dup (0) ;16byte数据操作空间00d2h
data ends
code segment
start: mov ax,data
mov ds,ax
mov di,0h ;指向数据地址
mov si,0d2h ;指向操作空间
;+++++++输出年份
mov dh,4h
mov dl,4h ;设置输出位置
mov cx,15h ;设置数据数量
show_y:
push cx ;保护计数器
mov cl,00000111b ;设置输出属性
mov ax,[di]
mov [si],ax
add di,2h
add si,2h
mov ax,[di]
mov [si],ax
add di,2h ;整理字符串并指向下一数据
mov si,00d2h ;指向整理后的字符串
call show_str ;调用字符串输出
inc dh ;调整输出位置
pop cx ;恢复计数器
loop show_y
;++++++++输出总收入
mov cx,15h ;设置数据数量
mov dh,4h
mov dl,0eh ;设置输出位置
mov bx,di ;保存数据地址备用
show_s:
push cx ;保护计数器
push dx ;保护输出位置设置
mov ax,[di]
add di,2h
mov dx,[di]
add di,2h ;配置待转换数据并指向下一数据
call dtocdw ;调用双字数据转换字符串
pop dx ;恢复输出位置设置
mov cl,00000111b ;设置输出属性
call show_str ;调用字符串输出
inc dh ;调整输出位置
pop cx ;恢复计数器
loop show_s
;++++++++输出雇员数
push di ;保存数据地址备用
mov cx,15h ;设置数据数量
mov dh,4h
mov dl,18h ;设置输出位置
show_n:
push cx ;保护计数器
push dx ;保护输出位置设置
mov ax,[di]
mov dx,0h
add di,2h ;配置待转换数据并指向下一数据
call dtocdw ;调用双字数据转换字符串
pop dx ;恢复输出位置设置
mov cl,00000111b ;设置输出属性
call show_str ;调用字符串输出
inc dh ;调整输出位置
pop cx ;恢复计数器
loop show_n
;++++++++输出平均收入
pop di ;指向雇员数数据地址
mov cx,15h ;设置数据数量
mov dh,4h
mov dl,22h ;设置输出位置
show_a:
push cx ;保护计数器
push dx ;保护输出位置设置
mov cx,[di]
add di,2h
mov ax,[bx]
add bx,2h
mov dx,[bx]
add bx,2h ;设置待计算数据并指向下一数据
call divdw ;调用双字除法生产待转换数据
call dtocdw ;调用双字数据转换字符串
pop dx ;恢复输出位置设置
mov cl,00000111b ;设置输出属性
call show_str ;调用字符串输出
inc dh ;调整输出位置
pop cx ;恢复计数器
loop show_a
mov ax,4c00h
int 21h
;--------------------------------------------------------
; 双字数据转换字符串
; 功能 - 将dword转换成十进制的字符串 字符串以0结尾
; 参数 - (dx) = dword的高16位
; (ax) = dword的低16位
; (ds:si) = 接收字符串的缓冲
; 返回 - 无
;--------------------------------------------------------
dtocdw: push ax
push cx
push dx
push di
push si ;保护现场
mov di,0 ;字符串长度计数器
chance: ;转换
mov cx,0ah ;设置为以十进制转换
call divdw ;调用双字除法
add cx,30h ;转换为字符
push cx ;保存字符
inc di ;计数器加一
mov cx,ax
add cx,dx
jcxz dtocdw_ok ;判断完成
jmp chance
dtocdw_ok: mov cx,di ;设置计数器
writ: ;写入指定位置并整理格式
pop [si]
inc si
loop writ
pop si
pop di
pop dx
pop cx
pop ax ;恢复现场
ret ;返回
;--------------------------------------------------------
; 双字除法
; 功能 - 进行不会产生溢出的除法运算
; 参数 - (dx) = dword型数据的高16位
; (ax) = dword型数据的低16位
; (cx) = 除数
; 返回 - (dx) = 结果的高16位
; (ax) = 结果的低16位
; (cx) = 余数
;--------------------------------------------------------
divdw: push bx ;保护现场
mov bx,ax
mov ax,dx
mov dx,0h
div cx ;被除数高位除法
push ax ;保存高位除法商
mov ax,bx ;恢复被除数低位,高位为高位除法余数
div cx ;被除数低位除法
mov cx,dx ;以CX保存余数
pop dx ;恢复商的高位
pop bx ;恢复现场
ret ;返回
;--------------------------------------------------------
; 字符串输出
; 功能 - 在指定的位置 用指定的属性 显示一个用0结束的字符串
; 参数 - (dh) = 行号(取值范围0-24)
; (dl) = 列号(取值范围0-79)
; (cl) = 属性
; (ds:si) = 字符串首地址
; 返回 - 无
;-------------------------------------------------------
show_str: push ax
push bx
push cx
push si
push es ;保护现场
mov ax,0b800h
mov es,ax ;定位显存
mov al,0a0h
mul dh
mov bx,ax ;设置行号
mov al,2h
mul dl ;设置列号
add bx,ax ;设置显示位置基址
mov al,cl ;设置字体属性
show: ;输出字符
mov cl,[si]
mov ch,0h
jcxz show_str_ok ;判定字符串结尾
mov es:[bx],cl
inc bx ;显示字符
inc si ;指向下一字符
mov es:[bx],al
inc bx ;设置字体属性
jmp show
show_str_ok:
pop es
pop si
pop cx
pop bx
pop ax ;恢复现场
ret ;返回
code ends
end start
=============================================================
笔者采取的是按列输出,优点在于便于数据地址的指向,便于算法思路的清晰显示。缺点是一定程度上牺牲时间和空间。 | | |