实验7 寻址方式在结构化数据访问中的应用

实验任务

下面是某公司从 1975 年成立一直到 1995 年的基本情况:

年份 收入 雇员 人均收入
1975 16 3 ?
1976 22 7 ?
1977 382 8 ?
1978 1356 13 ?
1979 2390 28 ?
1980 8000 38 ?
1995 5937000 17800 ?

下面程序已经完成数据的定义:

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
assume cs:codeseg
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'
;存放年份,每一项用4个字节表示
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;存放收入,每一项用4个字节表示
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;存放雇员,每一项用2个字节表示
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends

编程,将 data 段中的数据按如下格式写入 table 段中,并计算 21 年中的人均收入(取整)并保存到 table 段中:

完整代码

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','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,5937000
;以上是表示21年公司总收入的21个dword型数据
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型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
mov bp,0
mov bx,0
mov si,0
mov di,0
flag:
mov ax,si
mov dx,4
mul dx
mov di,ax
;存年份
mov ax,ds:[bx].0[di]
mov dx,ds:[bx].0[di+2]
mov es:[bp].0,ax
mov es:[bp].2,dx
;存收入
mov ax,word ptr ds:[bx].54H[di]
mov dx,word ptr ds:[bx].54H[di+2]
mov word ptr es:[bp+5],ax
mov word ptr es:[bp+7],dx
mov ax,si
mov dx,2
mul dx
mov di,ax
;存员工数
mov ax,word ptr ds:[bx].0A8H[di]
mov word ptr es:[bp+10],ax
;计算人均收入
;因被除数为32位,所以AX存高16位,DX存低16位
mov ax,word ptr es:[bp+5]
mov dx,word ptr es:[bp+7]
push cx
;被除数存在CX
mov cx,word ptr es:[bp+10]
div cx
mov es:[bp+13],ax
pop cx
inc si
add bp,10H
loop flag
mov ax,4c00H
int 21H
code ends
end start