【汇编语言】课程设计1---------------by.龙猫

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

Guess you like

Origin blog.csdn.net/a851248662/article/details/79318124