王爽《汇编语言》第3版)——课程设计1

assume cs:code

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'
	;21个年份字符串(4字节)
	
	dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
	dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
	;21年的公司每年的总收入( dword 双字 = 4字节)
	
	dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4073,5635,8226
	dw 11542,14430,15257,17800
	;21个公司每年雇员人数( word 字 = 2字节)
data ends

datanum segment
	db 'bryant_xw'
datanum ends

table segment
			  ;0123456789abcdef
	db 21 dup('year summ ne ?? ')
table ends

stack segment
	db 128 dup(0)
stack ends

string segment
												   ;'0000000000'						
	db 10 dup('0'),0								;0123456789 个位在9
string ends

code segment

	start:
		mov ax,stack
		mov ss,ax
		mov sp,128
		
		call input_table	;(1)初始化:即实验7的工作	
		call clear_screen	;(2)清屏	
		call output_table	;(3)输出
		mov ax,4c00h
		int 21h

;===============1.show1===========================
show_year:
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di
		
		mov bx,0b800h
		mov es,bx
	
		add di,3*2	;前面空3个
		mov cx,4
	showYear:
		mov dl,ds:[si]
		mov es:[di],dl;
		inc si
		add di,2
		loop showYear
		
		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		ret
;===============2.show2===========================
show_sum:
		push ax
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di
		
		mov ax,ds:[si+5]
		mov dx,ds:[si+7]
		call isShortDiv		;(line_152)判断是否是短除
		call init_reg 		;(line_106)初始化显存
		
		add di,10*2	;每行显示的位置

		call show_string	;(line_117)显示字符串
		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		pop ax
	     	   	   ;0123456789abcdef
		;db 21 dup('year summ ne ?? ')
		ret
;=================================================
init_reg:
		push bx	;因为bx之前保存字符串的下标
		
		mov bx,string
		mov ds,bx
		
		mov bx,0b800h
		mov es,bx
		pop bx
		ret
;=================================================		
show_string:
		push bx
		push cx
		push ds
		push es
		push si
		push di
		
	showString:
		mov cl,ds:[bx]
		jcxz showStringRet
		mov es:[di],cl
		add di,2
		inc bx
		jmp showString
	showStringRet:	
		pop di
		pop si
		pop es
		pop ds
		pop cx
		pop bx
		ret
;=================================================
long_div:
	mov ax,dx
	mov dx,0
	div cx
	push ax
	mov ax,ss:[bp]
	div cx
	mov cx,dx ;余数
	pop dx
	ret
;=================================================
isShortDiv:
		mov cx,dx	;若dx为0,则跳转短除
		jcxz shortDiv

		mov cx,10	;参考test10.2 long_div
		push ax
		
		mov bp,sp
		call long_div	;(line_141)
		add sp,2
		add cx,30h
		mov es:[bx],cl
		dec bx
		jmp isShortDiv
		shortDivRet:	ret
	shortDiv:				;参考test10.3
		mov cx,10
		div cx				;dx就是余数
		add dx,30h
		mov es:[bx],dl		
		mov cx,ax 
		jcxz shortDivRet	;(line_166)若cx为0跳转ret
		mov dx,0			;cx不为0,则dx清零
		dec bx 				;bx--向前跳转		
		jmp shortDiv
;===============3.show3===========================
show_employee: 
		
		push ax
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di

		mov ax,ds:[si+10] ;2字节,ax存低16,dx存高16,但是不会溢出
		mov dx,0

		call isShortDiv
		call init_reg

		add di,20*2
		call show_string

		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		pop	ax

			       ;0123456789abcdef
		;db 21 dup('year summ ne ?? ')
	ret
;===============4.show4===========================
show_avg:

		push ax
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di

		mov ax,ds:[si+13]
		mov dx,0
		
		call isShortDiv
		call init_reg
		add di,30*2
		call show_string

		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		pop	ax
				   ;0123456789abcdef
		;db 21 dup('year summ ne ?? ')
	ret
	
;===============5.show5===========================
show_num:
		push ax
		push bx
		push cx
		push dx
		push ds
		push es
		push si
		push di

		mov ax,datanum
		mov ds,ax

		mov ax,0b800h
		mov es,ax

		mov si,0
		mov di,2*160+124
		mov cx,9

	s1: mov al,ds:[si]
		mov ah,11001010B  	;绿底红色 
		mov es:[di],ax
		inc si
		add di,2
		loop s1

		pop di
		pop si
		pop es
		pop ds
		pop dx
		pop cx
		pop bx
		pop	ax
	ret
;=================================================
output_table: call init_reg_output_table 	;(line_xx:ds指向table中的数据-->es指向的显存地址)
		
		mov si,0
		mov cx,21
		mov di,160*3 	;从第3行开始显示
		mov bx,9		;

	outputTable:
		call show_year		;show1(line_45)
		call show_sum		;show2(line_75)
		call show_employee	;show3(line_177)
		call show_avg		;show4(line_210)
		call show_num		;show5(line_246)
		add si,16
		add di,160
		loop outputTable	
		ret
;=================================================
init_reg_output_table:	;(ds指向table中的数据-->es指向的显存地址)
		mov ax,table
		mov ds,ax
		mov ax,string
		mov es,ax
		ret ;
;=================================================
clear_screen:
	
	mov bx,0b800h      ;初始化显存段地址 0xb800
    mov es,bx
	mov bx,0
	mov dx,0700h	
	mov cx,4000 		
	clearScreen:
		mov es:[bx],dx
		add bx,2
		loop clearScreen
		ret
;=================================================
init_reg_input_table:
		mov	ax,data
		mov ds,ax
		
		mov ax,table
		mov es,ax
		ret
;=================================================			
input_table: call init_reg_input_table
		
		mov si,0
		mov di,21*4*2  ;24*4*2=168是员工偏移地址
		mov bx,0
		mov cx,21
	inputTable:	
			;-----------------------
			;1.年
			push ds:[si+0]
			pop es:[bx+0]
			push ds:[si+2]
			pop es:[bx+2]
			;-----------------------
			;2.收入
			mov ax,ds:[si+84]
			mov dx,ds:[si+86]
			mov es:[bx+5],ax	;summ的s开始位置是5
			mov es:[bx+7],dx
			;-----------------------
			;3.员工人数
			push ds:[di]
			pop es:[bx+10]
			div word ptr es:[bx+10] ;(ax)中存放商,(dx)中存放余数
			;-----------------------
			;4.把人均收入放到table
			mov es:[bx+13],ax
			;-----------------------
			add si,4
			add di,2
			add bx,16
			loop inputTable
				   		   ;0123456789abcdef
				;db 21 dup('year summ ne ?? ')
	ret
;=================================================
code ends
end start

结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bryant_xw/article/details/85111185