assume cs:code, ds:data, ss:stack
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
db 16 dup(0) ;用来存放临时转换显示的数据
data ends
stack segment
db 16 dup(0)
db 16 dup(0)
db 16 dup(0)
db 16 dup(0)
stack ends
code segment
start:
mov ax, data
mov ds, ax ;设置数据段
mov ax, stack
mov ss, ax
mov sp, 64 ;设置栈段
mov ax, 0b800h
mov es, ax ;设置显存段地址
mov bx, 280h ;显存结构化数组偏移地址
mov si, 0 ;源数据偏移地址,si关联data段
mov di, 0 ;目标数组偏移地址
mov dl, 2 ;字符颜色属性
mov cx, 21
s0:
push cx ;把cx的值保护起来
push di
mov cx, 4 ;循环4次完成年份的显示
s1:
mov al, 0[si] ;si是源数据的偏移
mov es:[bx+di], al ;存放颜色属性到显存
mov es:[bx+di+1], dl ;存放字符到显存
inc si ;源数据偏移+1
add di, 2 ;一个字符的占用2个字节
loop s1 ;循环4次完成年份的显示
pop di
pop cx ;还原cx的值
add bx, 160 ;跳到下一行显示
loop s0 ;完成"年份"的显示 一共21年
mov bx, 2d0h ;显存结构化数组偏移地址
mov si, 0d2h ;源数据偏移地址 这个段存放的是员工的数量
mov di, 0 ;目标数组偏移地址
mov cx, 21
s2:
mov ax, 168[di]
call dtoc
call show_str
add di, 2 ;员工数量的数据为dword型 所以+2
add bx, 160 ;换行
loop s2 ;完成员工人数的显示 一共21年
mov bx, 2f8h ;显存结构化数组偏移地址
mov si, 0d2h ;源数据偏移地址
mov di, 0 ;目标数组偏移地址
mov bp, 0 ;源数据员工数量的偏移
mov cx, 21
s9:
push cx
mov ax, 84[di] ;总收入存放低16位
mov dx, 86[di] ;总收入存放高16位置
mov cx, ds:168[bp] ;员工数量赋给cx
div cx ;完成除法后商存储在ax中
call dtoc ;对ax的数值进行int转char
push bp ;把bp的值保护起来
call show_str
pop bp ;还原bp
add di, 4
add bp, 2 ;员工数量占用2个字节所以地址+2
add bx, 160 ;换行
pop cx
loop s9 ;完成人均收入的显示
mov bx, 2a8h ;显存结构化数组偏移地址
mov si, 0d2h ;源数据偏移地址
mov di, 0 ;目标数组偏移地址
mov cx, 21
s10:
push cx
push bx
mov bx, 0
mov ax, 84[di] ;收入低16位
mov dx, 86[di] ;收入高16位
s99:
call divdw ;dx为高16商,ax为低16商,cx为余数
push cx ;余数压栈
mov cx, dx ;高16位商赋给cx
jcxz yes ;如果高16商为0则跳转
pop cx ;取出余数
add cx, 30h ;int转char
push cx ;char压栈
inc bx ;计数器功能
jmp short s99
yes:
mov cx, ax ;ax为低16商赋给cx
jcxz yes1 ;如果低16位为0则跳到yes1
pop cx ;取出上一次的余数
add cx, 30h ;int转char
push cx ;char压栈
inc bx ;计数器功能
jmp short s99
yes1:
pop cx ;取出最后一位的余数
add cx, 30h ;int转char
push cx ;char压栈
inc bx ;计数器功能
nop
nop
mov cx, bx ;计数器的数值为循环次数
s11:
pop ax ;取出char
mov [si], al ;赋给data段
inc si ;源数据偏移地址+1
loop s11 ;进行循环,实现字符串的正序排放
mov al, 0 ;字符串结尾0
mov [si], al ;写到data段
mov si, 0d2h ;再次将si指向字符串开始,为显示作准备
pop bx ;显存结构化数组偏移地址
pop cx ;外层循环次数 21年共21次
call show_str ;显示
add bx, 160 ;换行
add di, 4 ;收入的数据偏移 因为是dword类型,所以+4
loop s10 ;完成总收入的显示
mov ax, 4c00h
int 21h
dtoc:
push cx
push bx ;显存结构化数组偏移地址
mov bx, 0 ;此bx作为计数器
s8: ;把int转为char推入栈中
mov dx, 0
mov cx, 0ah
div cx
mov cx, ax
jcxz ok
add dx, 30h
inc bx
push dx
jmp short s8
ok: ;完成最后一位int的char推入
add dx, 30h
push dx
inc bx
mov cx, bx
s3: ;从栈中取出字符串,完成正序现实
pop ax
mov [si], al
inc si
loop s3
mov al, 0
mov [si], al ;写入0代表字符串的结束
mov si, 0d2h ;再次将si指向字符串开始,为显示作准备
pop bx
pop cx
ret
show_str:
push cx
push bx
mov bp, bx
mov cl, 2
mov bl, cl ;将cl中的内容保护起来
s4:
mov cl, [si]
mov ch, 0 ;cx高位置0
jcxz ok1 ;cx为0则表示字符串的结尾
mov es:[bp], cl ;写入字符
mov es:[bp+1], bl ;写入字符颜色属性
inc si ;源字符串偏移+1
add bp, 2 ;写入显存的bp偏移+2
jmp short s4
ok1:
mov si, 0d2h ;再次将si指向字符串开始,为下个循环存储作准备
pop bx
pop cx
ret
;mov ax, 84[di] 收入低16位
;mov dx, 86[di] 收入高16位
divdw:
push bx ;下面要动用到dx所以把bx保存起来
mov cx, 0ah ;cx=10
push ax ;原本被除低16位数压栈
mov ax, dx ;被除数高16位赋给ax,ax作为被除数的低16位
mov dx, 0 ;被除数高16位置0
div cx ;ax存商,dx存余数
mov bx, ax ;bx中存放高16位
pop ax ;被除数低16位
div cx ;ax存商,dx存余数
mov cx, dx ;cx中存放余数
mov dx, bx ;高16位放回dx中
pop bx ;还原bx
ret
code ends
end start
【汇编语言】课程设计1---------------by.龙猫
最新推荐文章于 2019-11-11 00:34:13 发布