任务说明:某公司从1975成立一直到1995年的基本情况如下:
年份 | 收入(千美元) | 雇员(人) | 人均收入(千美元) |
1975 | 16 | 3 | ? |
1976 | 22 | 7 | ? |
1977 | 382 | 9 | ? |
1978 | 1356 | 13 | ? |
1979 | 2390 | 28 | ? |
… | 8000 | 38 | ? |
1995 | 5937000 | 17800 | ? |
已知程序中的数据按下面的方式定义:
assume cs:codesg,ds:datasg,es:table datasg 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个字符串 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000 dd 5937000 ;以上是公司21年总收入 dw 3,7,9,13,28,38,130,220,476,78,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 以上表示21年每年雇佣人数 dataend table segment db 21 dup ('year summ ne ?? ') table ends
编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
年份(4字节) | 空格 | 收入(4字节) | 空格 | 雇员数
(2字节) |
空格 | 人均收入(2字节) | 空格 | |||||||||
行内
地址 1年 1行 每行的始址 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Table:0H | ‘1975’ | 16 | 3 | ? | ||||||||||||
Table:10H | ‘1976’ | 22 | 7 | ? | ||||||||||||
Table:20H | ‘1977’ | 382 | 9 | ? | ||||||||||||
Table:30H | ‘1978’ | 1356 | 13 | ? | ||||||||||||
Table:40H | ‘1979’ | 2390 | 28 | ? | ||||||||||||
…. | … | 8000 | 38 | ? | ||||||||||||
Table:140H | ‘1995’ | 5937000 | 17800 | ? | ||||||||||||
一、分析设计想法
这个题目的本质是循环读取字符串,将字符串复制到寄存器中并放到指定的内存单元中,同时用到了除法,只要一步一步稳扎稳打的进行,一般是不会出现错误的。
二、程序的设计
assume cs:codesg 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 summ ne ?? ');首先覆盖掉空的内存单元,方便查看结果 table ends stack segment dw 0,0,0,0,0,0,0,0;定义堆栈段 stack ends codesg segment start: mov ax,table mov es,ax mov ax,data mov ds,ax mov bx,0 ;存年份偏移 mov si,0 ;存人数偏移 mov di,0 ;存table段中偏移 mov cx,21 ;循环21年 s0: ;将数据段中的年份复制到附加段中 mov ax,[bx] mov es:[di],ax mov ax,[bx+2] mov es:[di+2],ax ;将数据段中的收入复制到附加段中 mov ax,[bx+84] mov es:[di+5],ax mov ax,[bx+86] mov es:[di+7],ax ;将数据段中的人数复制到附加段中 mov ax,[si+168] mov es:[di+10],ax ;通过除法计算出人均收入 mov ax,[bx+84];低位 mov dx,[bx+86];高位 div word ptr [si+168];商存在ax中 mov es:[di+13],ax add bx,4 add si,2 add di,16 loop s0 mov ax,4c00H int 21H codesg ends end start
三、程序的结果
四、心得体会
通过这个大作业程序的设计,我进一步掌握了堆栈段,数据段和附加段的简单使用,并且学会了如何在汇编语言中使用除法,在除法的过程中分别用哪些存储器存储数据,并通过格式化的控制,能够存储较为整齐的数据,在学习汇编语言程序设计的过程中,我常常会遇到自己没有思绪的程序,完全不知道该怎么写,或者按照我思考的样子却写不出我想要的结果,但是慢慢修改,慢慢积累,遇到的坑多了,也就不容易遇到坑了,写不好没关系,哪怕再小的程序,多写多改,慢慢地我就会提高的。