rainymay 发表于 2012-2-12 16:45:57

课程设计1,贴出来和大家分享分享,不足之处希望指出


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:               ;取得员工数
               call dtoc                      ;将员工数转换为ASCII存放在table段中
               
               mov si, 0AH               ;设置总收入的存放位置
               mov dx,    ;将总收入的高16位送到dx
               mov ax,    ;将总收入的低16位送到ax
               call dtoc                      ;将总收入数转换为ASCII存放在table段中
               
               mov si, 1FH               ;设置平均收入的存放位置
               div word ptr ds:       ;计算平均收入
               xor dx, dx                  ;将被除数的高16位清零
               call dtoc
               
               mov dx,          ;取得年份高16位
               mov ax,                 ;取得年份低16位
               mov es:, ax            ;存放年份
               mov es:, dx
               
               mov dl, 0                  ;设置末尾0
               mov es:, dl
               
               xor si, si                      ;清空si,es:指向输出字符串的起始处
               
               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:, 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:将定位到输出位置
                mov bh, cl               ;保存颜色代码,存放bx高位
                xor cx, cx
               
            s: mov cl, ds:
                jcxz retFlag                ;如果读取结束,返回
                mov bl, cl                  ;保存字符ASCII码,存放bx低位
                mov es:, 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不容易啊,总算写出来了!!!
页: [1]
查看完整版本: 课程设计1,贴出来和大家分享分享,不足之处希望指出