任务说明:某公司从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
三、程序的结果
四、心得体会
通过这个大作业程序的设计,我进一步掌握了堆栈段,数据段和附加段的简单使用,并且学会了如何在汇编语言中使用除法,在除法的过程中分别用哪些存储器存储数据,并通过格式化的控制,能够存储较为整齐的数据,在学习汇编语言程序设计的过程中,我常常会遇到自己没有思绪的程序,完全不知道该怎么写,或者按照我思考的样子却写不出我想要的结果,但是慢慢修改,慢慢积累,遇到的坑多了,也就不容易遇到坑了,写不好没关系,哪怕再小的程序,多写多改,慢慢地我就会提高的。