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' ;以上是表示21年的21个字符串 ;字节类型 BX+0~83(0~53H)
;这一组数据用SI表示,这组偏移过后,SI指向下一组数据时,SI归零,重来 CX=15H
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型数据 BX+84~168(就是54H~0A8),这一组21个数据,用SI表示
;CX=15H
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型数据 ;字类型
;这一组21个数据,也用SI表示; CX=15H
dw 0,0
data ends
table SEGMENT
db 21 DUP ('year summ ne ?? ')
table ends
STACK segment
db 7 DUP ('year summ ne ?? ')
STACK ends
;编程,将data段中的数据按图上格式写入到table段中,并计算21年终的人均收入(取整),结果也按照图上的
;格式保存在table段中;
code SEGMENT
start: MOV AX,DATA
MOV DS,AX
MOV AX,TABLE
MOV ES,AX
MOV AX,STACK
MOV SS,AX
MOV SP,112
;>>>>>>>>>>>>>>>>>>>>>>>>>>>年份&总收入收入开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MOV CX,15H
YEARMONEY: MOV DS:[210],CX
MOV CX,2
YEARMONEY1: MOV AX,[BX].0[SI] ;将年份读入一个字
MOV ES:[BP].0[DI],AX ;将一个字的年份写入
MOV AX,[BX].54H[SI] ;将总收入读入一个字
MOV ES:[BP].5[DI],AX ;将总收入写入一个字
PUSH AX ;将总收入,入栈;
ADD SI,2
ADD DI,2
LOOP YEARMONEY1
MOV BYTE PTR ES:[BP+4],' '
MOV BYTE PTR ES:[BP+9],' '
ADD BP,10H
MOV DI,BX
MOV CX,DS:[210]
LOOP YEARMONEY
;>>>>>>>>>>>>>>>>>>>>>>>>>>>年份&总收入结束>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>雇员人数&人均收入结束>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MOV SI,2AH ;退着走
MOV BP,140H ;BP也退着走,
MOV DI,BX ;DI清零
MOV BX,0A6H ;BX偏移了,就用不到IDATA了.
MOV CX,15H ;循环次数依然是21次
S: MOV AX,[BX+SI] ;定位到最后一个雇员人数读入
MOV ES:[BP+0AH],AX ;将雇员人数写入对应字单元中;
POP DX
POP AX
DIV WORD PTR ES:[BP+0AH] ;除雇员人数-----
MOV ES:[BP+0DH],AX ;将人均收入写入指定字单元
MOV BYTE PTR ES:[BP+0CH],' ' ;在写完雇员人数后写入一个空格
MOV BYTE PTR ES:[BP+0FH],' ' ;在最后面写入一个空格
SUB SI,2
SUB BP,10H ;BP每次-10,就是退一行
LOOP S
MOV AX,4c00h
INT 21h
code ENDS
END start