这道题主要考察了汇编语言寻址方式和数据的存取规则是否熟练,调试过程还是颇费了些周折。好歹还是坚持把代码调试通过了。这里把代码贴出来和感兴趣的朋友分享一下。
下面的代码在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