. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计1,求找茬  [待解决] 回复[ 0次 ]   点击[ 400次 ]  
lonelyhover
[帖 主]   [ 发表时间:2013-05-23 13:53 ]   [引用]   [回复]   [ top ] 
荣誉值: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

=============================================================
笔者采取的是按列输出,优点在于便于数据地址的指向,便于算法思路的清晰显示。缺点是一定程度上牺牲时间和空间。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved