|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码 不容易啊,总算写出来了!!!
|
|