汇编语言 王爽第二版 课程设计1

汇编语言要比高级语言考虑很多细节,比如寄存器冲突的问题。

代码都是一块一块的调出来的。

在完成题目要求的同时还加了个背景。

不说了,直接上代码吧。

assume	cs:code

data	segment
	db	'1975',0,'1976',0,'1977',0,'1978',0,'1979',0,'1980',0,'1981',0,'1982',0,'1983',0
	db	'1984',0,'1985',0,'1986',0,'1987',0,'1988',0,'1989',0,'1990',0,'1991',0,'1992',0
	db	'1993',0,'1994',0,'1995',0
	;以上是21年公司的21个字符串
	
	dd	16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
	dd	345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
	;以上是21年公司总收入的21个dword型数据
	
	dw	3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
	dw	11542,14430,15257,17800
	;以上是21年公司雇员人数的21个word型数据
	
	dw	21 dup (0)
	;以上存放21年公司人均收入
data	ends

state	segment
	db	'Group Members: Qin Weichao, Yang Rui, Li Yonghong, Si Yuhan',0	;60个字节
	db	'Year:',0,'Total:',0,'Number:',0,'Average:',0					;30个字节
	db	'Poweridea Company Annual Data',0								;30个字节
state	ends

stack	segment
	db 32 dup (0)
stack	ends

string	segment
	db	10 dup (0)
string	ends

code	segment
start:		
			mov 	cx, 21			;计算部分
			mov		ax, data
			mov 	ds, ax
			mov		bx, 105			;指向被除数
			mov 	si, 189			;指向除数
			mov 	di, 231			;指向商
			
calculate:	mov 	ax, ds:[bx]
			add 	bx, 2 
			mov 	dx, ds:[bx]
			add 	bx, 2
			div		word ptr ds:[si]
			mov 	ds:[di], ax
			add 	di, 2
			add		si, 2
			loop	calculate		;计算部分结束
			
			mov		ax, state
			mov		ds, ax
			mov		si, 90
			mov		dh, 0
			mov		dl, 25
			call	show_str	
			
			mov		dh, 1			;小组成员说明
			mov		dl, 9
			mov		cl, 34H
			
			mov		si, 0
			call	show_str
			
			mov		bx, 0			;设置背景
			mov		dl, 3CH
			mov		cx, 2
s1:			call	Background
			add		bx, 40
			loop	s1
			
			mov		bx, 20
			mov		dl, 5AH
			mov		cx, 2
s2:			call	Background
			add		bx, 40
			loop	s2
			
			mov		cx, 160
			mov		bx, 1
			mov		ax, 0B800H
			mov		es, ax
s3:			mov		byte ptr es:[bx], 4BH
			add		bx, 2
			loop	s3
			
			mov		si, 60			;打印表头
			mov		dh, 2
			mov		dl, 0
			mov		cl,	49H
			call	show_str
			add		si, 6
			mov		dl, 20
			call	show_str
			add		si, 7
			mov		dl, 40
			call	show_str
			add		si, 8
			mov		dl, 60
			call	show_str
			
			mov 	cx, 21			;打印年份
			mov 	ax, data
			mov 	ds, ax
			mov 	si, 0
			mov 	dh, 3 
			mov 	dl, 0
printy:		push	cx
			mov 	cl, 4AH			;设置颜色
			call	show_str
			inc 	dh
			add 	si, 5
			pop 	cx
			loop	printy			;打印年份结束
			
			mov		cx, 21
			mov 	dh, 3
			mov		bx, 105
			
print1:		push	cx
			push	dx

			mov 	ax, string		;打印总收入,转化字符串到string段
			mov 	es, ax
			mov		si, 0
			mov		ax, data
			mov		ds, ax
			mov 	ax, ds:[bx]
			add 	bx, 2
			mov 	dx, ds:[bx]
			add 	bx, 2
			call 	dwtoc
			
			pop		dx
			mov 	dl, 20			;打印转化好的字符串
			mov 	cl, 4AH
			mov		ax, string
			mov		ds, ax
			mov 	si, 0
			call	show_str
			inc 	dh
			pop		cx
			loop	print1
			
			mov		cx, 21
			mov 	dh, 3
			mov		bx, 189
print2:		push	cx
			push	dx
			mov		ax, string		;打印雇员人数,转化字符串到string段
			mov 	es, ax
			mov		si, 0
			mov		ax, data
			mov		ds, ax
			mov		ax, ds:[bx]
			add		bx, 2
			call	dtoc
			pop		dx
			mov		dl, 40 			;打印转化好的字符串
			mov 	cl, 4AH
			mov		ax, string
			mov		ds, ax
			mov 	si, 0
			call	show_str
			inc		dh
			
			pop		cx
			loop	print2
			
			mov		cx, 21
			mov 	dh, 3
			mov		bx, 231
print3:		push	cx
			push	dx
			mov		ax, string		;打印人均收入,转化字符串到string段
			mov 	es, ax
			mov		si, 0
			mov		ax, data
			mov		ds, ax
			mov		ax, ds:[bx]
			add		bx, 2
			call	dtoc
			pop		dx
			mov		dl, 60 			;打印转化好的字符串
			mov 	cl, 4AH
			mov		ax, string
			mov		ds, ax
			mov 	si, 0
			call	show_str
			inc		dh
			
			pop		cx
			loop	print3
			
			mov		bh, 0			;设置光标
			mov		dh, 21
			mov		dl, 0
			mov		ah, 2
			int 	10H
			
			mov 	ax, 4C00H		;程序返回
			int 	21H

;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),ds:si指向字符串的首地址
;返回:无
show_str:	push	es
			push	ax
			push	cx
			push	si
			
			mov		ax, 0B800H
			mov		es, ax
			mov 	al, 0A0H
			mul		dh
			mov		di, ax
			mov 	al, 02H
			mul 	dl
			add		di, ax		;设置di的值
			
show_str_s1:
			mov 	ch, 0
			mov 	cl, ds:[si]
			jcxz	show_str_s2
			mov 	al, ds:[si]
			mov 	es:[di], al
			add 	di, 2
			inc 	si 
			jmp short	show_str_s1
show_str_s2:
			pop		si
			pop		cx
			pop		ax
			pop		es
			ret	

;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
;	   (dx)=dword型数据的高16位
;	   (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
;	  (cx)=余数
divdw:		push	bx		;保存调用子程序前bx的值
			
			push	ax
			mov 	ax, dx 
			mov 	dx, 0
			div 	cx
			mov 	bx, ax 	;保存商的高16位
			pop		ax
			div		cx
			mov 	cx, dx 	;余数放入cx中
			mov 	dx, bx 
			
			pop		bx 		;恢复bx的值
			ret

;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据
;		es:si指向字符串的首地址
;返回:无
dtoc:		push	bp			;保存环境
			push	bx
			push	cx
			push	dx
			
			mov		bp, 0		;记录除法的次数
dtoc_s1:	mov		bx, 10
			mov		dx, 0
			div		bx
			add		dx, 30H
			push	dx			;将分离出来的数字以ASCII码值入栈
			inc		bp
			mov		cx, ax		;判断商是否为0
			jcxz	dtoc_s2
			jmp short	dtoc_s1
dtoc_s2:	mov		cx, bp
dtoc_s3:	pop		ax
			mov 	es:[si], al
			inc		si
			loop	dtoc_s3
			mov	byte ptr	es:[si], 0		;字符串以0为结尾符
			
			pop		dx				;恢复环境
			pop		cx
			pop		bx		
			pop		bp
			ret
;名称:dwtoc
;功能:将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位
;	   (dx)=dword型数据的高16位
;		es:si指向字符串的首地址
;返回:无
dwtoc:		push	bp		;保存环境
			push	bx
			push	cx
			
			mov		bp, 0 ;记录除法的次数
dwtoc_s1:	mov		cx, 10
			call	divdw
			add		cx, 30H
			push	cx	  ;将分离出来的数字以ASCII码值入栈
			inc		bp
			mov		cx, dx
			jcxz	dwtoc_s2
			jmp short	dwtoc_s1
dwtoc_s2:	mov		cx, ax
			jcxz	dwtoc_s3
			jmp short	dwtoc_s1
dwtoc_s3:	mov 	cx, bp
dwtoc_s4:	pop		ax
			mov		es:[si], al
			inc		si
			loop	dwtoc_s4
			mov	byte ptr	es:[si], 0		;字符串以0为结尾符
														
			pop		cx						;恢复环境
			pop		bx		
			pop		bp
			ret
			
;名称:Background
;功能:设置背景颜色
;参数:(bx)=列数,(dl)=颜色
Background:
			push	es
			push	ax
			push	cx
			push	dx
			push 	bx
			
			mov		ax, 0B800H
			mov		es, ax
			add		bx, bx
			add		bx, 321				
			mov		cx, 22
			
Back1:		push	cx
			mov		cx, 20
Back2:		mov		byte ptr es:[bx], dl
			add		bx, 2
			loop	Back2
			add		bx, 120
			pop		cx
		    loop	Back1
		    
		    pop		bx
		    pop		dx
		    pop		cx
		    pop		ax
		    pop		es
		    ret
code	ends		
end		start


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值