;===============================================================================
;将DATA段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),
;结果也按照下面的格式保存在table段中.
;===============================================================================
ASSUME CS:CODE,DS:DATA
;-------------------------------------------------------------------------------
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'
;年收入
DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
DD 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;雇员人数
DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
DW 11542,14430,15257,17800
DATA ENDS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
TABLE SEGMENT
DB 21 DUP ('YEAR SUMN NE ?? ')
TABLE ENDS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
CODE SEGMENT
START:
MOV AX,DATA ;初始化DS
MOV DS,AX
MOV AX,TABLE ;初始化ES为table段段地址
MOV ES,AX
MOV BX,0 ;BX用来寻址数据
MOV DI,0 ;0==第一组数据年份数据的初始偏移地址
MOV CX,21 ;循环次数=21,有21组数据
STORE_ALL_YEAR: ;储存所有年份
PUSH CX ;保存外层循环次数
MOV CX,4 ;循环次数=4,4位数
STORE_ONE_YEAR: ;储存一年的年份
MOV AX,[BX] ;将年份一位数字的ASCII码转移到AX中
MOV AH,0 ;高位置零
MOV ES:[DI],AL ;传送到table段
INC BX ;BX+1,准备传送下一位数字的ASCII码
INC DI ;DI+1,准备储存下一位数字的ASCII码
LOOP STORE_ONE_YEAR ;准备储存一个年份的下一位数字的ASCII码
POP CX ;恢复外层循环次数
ADD DI,0CH ;DI指向下一组数据的起始偏移地址
LOOP STORE_ALL_YEAR ;准备储存下一个年份
MOV DI,5 ;5==第一组数据收入数据的初始偏移地址
MOV CX,21 ;循环次数=21,21个DWORD型数据
STORE_ALL_INCOME: ;储存所有年份的收入
PUSH CX ;保存外层循环次数
MOV CX,2 ;循环次数=2,收入为DWORD型数据
STORE_ONE_INCOME: ;储存一年的收入
MOV AX,[BX] ;将收入的低16位/高16位传送到AX
MOV ES:[DI],AX ;传送到table段
ADD BX,2 ;BX+2,准备传送本年份收入的高16位
ADD DI,2 ;DI+2,准备储存本年份收入的高16位
LOOP STORE_ONE_INCOME
POP CX ;恢复外层循环次数
ADD DI,0CH ;DI指向下一组数据收入数据的起始偏移地址
LOOP STORE_ALL_INCOME
MOV DI,0AH ;0AH==第一组数据雇员数数据的初始偏移地址
MOV CX,21
STORE_ALL_EMPLOYEE_NUM: ;储存所有年份的雇员数
MOV AX,[BX] ;将雇员数传送到AX
MOV ES:[DI],AX ;传送到table段
ADD BX,2 ;BX+1,准备传送下一组数据的雇员数
ADD DI,10H ;DI指向下一组数据雇员数数据的起始偏移地址
LOOP STORE_ALL_EMPLOYEE_NUM
MOV BX,0 ;用来在table段中寻址
MOV CX,21 ;循环次数21
INCOME_AVERAGE: ;计算人均收入
MOV AX,ES:5[BX] ;被除数的低16位
MOV DX,ES:7[BX] ;被除数的高16位
DIV WORD PTR ES:0AH[BX] ;除数
MOV ES:0DH[BX],AX ;商储存到这一组数据的人均收入处
ADD BX,10H ;BX指向下一组数据的起始偏移地址
LOOP INCOME_AVERAGE ;计算下一组数据的人均收入
MOV AX,4C00H ;程序返回
INT 21H
CODE ENDS
END START
;---------------------------------------------------------------------------------
6415

被折叠的 条评论
为什么被折叠?



