王爽的彙編語言實驗7解答

這道題主要考察了彙編語言尋址方式和數據的存取規則是否熟練,調試過程還是頗費了些周折。好歹還是堅持把代碼調試通過了。這裏把代碼貼出來和感興趣的朋友分享一下。

下面的代碼在MASM5下調試通過。(不失一般性,選取了後面的3年數據)

; analysis for 3 years for efficiency and it is easy to extend to 21 years.
assume cs:codesg 

stack segment
	db 32 dup (0)  
stack ends

year segment
	db '1993','1994','1995'
year ends

salary segment
	dd 3753000,4649000,5937000;394428h,46f028h,5a9768h
salary ends

;employee num
enum	segment
	dw 14430,15257,17800;385eh,3b99h,4588
enum ends

table segment
	db 3 dup ('year sala en as ')
table ends

codesg segment
start:
	;stack init
	mov ax,stack
	mov ss,ax
	mov sp,32
	
	;loop init
	mov si,0 ; year size and salary size =4
	mov bp,0 ; enum size =2
	mov cx,3
	mov ax,table
	mov es,ax ; es put table
	mov di,0
loop_entry:
	push cx
	
	;copy year 
	mov ax,year
	mov ds,ax	
	mov cx,4
	mov bx,si	
	
loop_year:
	mov ah,[bx]
	mov es:[di],ah
	inc di
	inc bx
	loop loop_year
	;copy space
	mov byte ptr es:[di],' '
		
	;copy salary
	inc di
	mov ax,salary
	mov ds,ax	
	mov cx,4
	mov bx,si
	;prepare for calc average salary
	push [bx+2]
	push [bx]		
loop_salary:
	mov ah,[bx]
	mov es:[di],ah
	inc di
	inc bx
	loop loop_salary
	;copy space
	mov byte ptr es:[di],' '

;copy employee num
	inc di
	mov ax,enum
	mov ds,ax	
	mov cx,2
	mov bx,bp
	;prepare for calc average sala
	push [bx]
loop_enum:
	mov ah,[bx]
	mov es:[di],ah
	inc di
	inc bx
	loop loop_enum
	;copy space
	mov byte ptr es:[di],' '

	;calc avarage salay
	pop bx;
	pop ax;
	pop dx;		
	div bx
	
	;averary salary
	inc di
	mov es:[di],ax
	inc di
	inc di
	;copy space
	mov byte ptr es:[di],' '
	inc di
	
	add si,4
	add bp,2
	pop cx
	loop loop_entry
 	
	mov ax,4c00H
	int 21H

codesg ends

end start
	

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章