鱼C论坛

 找回密码
 立即注册
查看: 2096|回复: 0

[技术交流] 课程设计1,贴出来和大家分享分享,不足之处希望指出

[复制链接]
发表于 2012-2-12 16:45:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code, ds:data, es:table, ss:stack

data segment

db '1975', '1976', '1977', '1978', '1979', '1980'
db '1981', '1982', '1983', '1984', '1985', '1986'
db '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
;以上是表示21年的21个字符串

dd 16, 22, 382, 1356, 2390, 8000 ;偏移84
dd 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000
dd 3753000, 4649000, 5937000
;以上是表示21年公司总收入的21个dword型数据

dw 3, 7, 9, 13, 28, 38 ;偏移A8
dw 130, 220, 476, 778, 1001, 1442
dw 2258, 2793, 4037, 5635, 8226, 11542
dw 14430, 15257, 17800
;以上是表示21年公司雇员人数的21个word型数据

data ends

table segment

          db 40 dup (' ')

table ends

stack segment

          dw 16 dup(0)

stack ends

code segment

start:       mov ax, data
               mov ds, ax                 ;设置数据段为原数据所在处
               mov ax, table
               mov es, ax                 ;设置附加段为目标数据所在处
               mov ax, stack
               mov ss, ax                 ;程序中使用的栈空间
               mov sp, 20H              ;设置栈顶指针
               mov bx, 2                  ;行计数器
               mov si, 0
               mov di, 0
               mov bp, 0

               mov cx, 21                 ;设置循环,21次
     main: push cx

               mov si, 15H                ;设置员工数的存放位置
               xor dx, dx
               mov ax, ds:[bp+0A8H]                 ;取得员工数
               call dtoc                      ;将员工数转换为ASCII存放在table段中
               
               mov si, 0AH                 ;设置总收入的存放位置
               mov dx, [di+056H]     ;将总收入的高16位送到dx
               mov ax, [di+054H]     ;将总收入的低16位送到ax
               call dtoc                      ;将总收入数转换为ASCII存放在table段中
               
               mov si, 1FH                 ;设置平均收入的存放位置
               div word ptr ds:[bp+0A8H]       ;计算平均收入
               xor dx, dx                  ;将被除数的高16位清零
               call dtoc
               
               mov dx, [di+2]           ;取得年份高16位
               mov ax, [di]                ;取得年份低16位
               mov es:[0], ax            ;存放年份
               mov es:[2], dx
               
               mov dl, 0                    ;设置末尾0
               mov es:[28H], dl
               
               xor si, si                      ;清空si,es:[si]指向输出字符串的起始处
               
               mov dh, bl                 ;设置显示行数
               mov dl, 20                 ;设置显示列数
               mov cl, 2                   ;设置颜色
               call show_str
               
               add di, 4
               add bp, 2
               inc bx                        ;行数自增1
               
               pop cx
               loop main
               
               mov ax, 4c00H
               int 21H
               
               
dtoc:       push ax
               push bx
               push cx
               push dx
               push si
               push di
               mov di, 0                     ;将计数器置0
               
       d_1: mov cx, 10                 ;将除数放入cx
               call divdw
               add cx, 30H                 ;将数字转换为ASCII码
               push cx                       ;将转换后的ASCII码入栈
               mov cx, dx                 ;将商的高16位放入cx
               inc di
               jcxz d_2                      ;如果商的高16位为0,则跳转进行判断低16位
               jmp short d_1
               
       d_2: mov cx, ax                 ;将商的低16位放入cx
               jcxz d_3
               jmp short d_1
               
       d_3: mov cx, di                  ;设置循环变量
               
       d_4: pop dx                       ;将转换后的ASCII码出栈,放入DX
               mov es:[si], dl
               inc si
               loop d_4
               
               pop di
               pop si
               pop dx
               pop cx
               pop bx
               pop ax
               retn
               
divdw:     push bx
               push si

               mov bx, ax                 ;保存被除数的低16位
               mov ax, dx                 ;将高16位放置在AX中
               xor dx, dx                  ;高16位清零
               div cx                         ;高16位进行除法,商在AX 余数在DX
               mov si, ax                  ;保存高16位的商
               mov ax, bx
               div cx                        ;低16位进行除法,商在AX 余数在DX
               mov cx, dx
               mov dx, si

               pop si
               pop bx
               retn

show_str: push ax                  ;将子程序中使用的寄存器原始值压入栈
                push bx
                push di
                push es
                push ds
                
                mov ax, es
                mov ds, ax
                mov ax, 0B800H
                mov es, ax                 ;存放显存起始地址
                mov ax, 0A0H
                mul dh                        ;计算行偏移地址,存放在ax中
                mov di, ax
                mov ax, 2H
                mul dl                        ;计算列偏移地址,存放在ax中
                add di, ax                  ;行+列=总偏移 es:[di]将定位到输出位置
                mov bh, cl                 ;保存颜色代码,存放bx高位
                xor cx, cx
                
            s: mov cl, ds:[si]
                jcxz retFlag                ;如果读取结束,返回
                mov bl, cl                  ;保存字符ASCII码,存放bx低位
                mov es:[di], bx
                add di, 2
                inc si
                jmp short s                 ;继续循环读取
                
     retFlag:pop ds                    
                pop es
                pop di
                pop bx
                pop ax
                retn
code ends

end start
不容易啊,总算写出来了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表