王爽《汇编语言》实验7

;===============================================================================

;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        ;初始化EStable段段地址

    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,21DWORD型数据

    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

;---------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值