蒙珣的博客

活好当下,做好今天该做的事情。

0%

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

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

Power idea 公司从 1975 年成立一直到 1995 年的基本情况如下。

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

下面的程序中,已经定义好了这些数据:

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
assume cs:code,ds:data,ss:stack

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

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

data segment

db '1975','1976','1977','1978','1979','1980','1981','982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
; 以上是表示21年的21个字符串 year

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个数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
; 以上是表示21年公司的员工数量

; 8位除法还是16位除法,div 寄存器还是 div 内存 数据从哪里来,数据移动 比较好。通过栈比较好,还是通过寄存器比较好

data ends

table segment
;0123456789ABCDEF
db 21 dup ('year summ ne ?? ')

table ends

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

提示,可将 data 段中的数据看成是多个数组,而将 table 中的数据看成一个结构型数据的数组,每个结构型数据中包含多个数据项。可用 bx 定位每个结构型数据,用 idata 定位数据项,用 si 定位数组项中的每个元素,对于 table 中的数据的访问可采用**[bx].idata[bx].idata[si]**的寻址方式

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
assume cs:code,ds:data,ss:stack

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

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

data segment

db '1975','1976','1977','1978','1979','1980','1981','982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
; 以上是表示21年的21个字符串 year

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个数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
; 以上是表示21年公司的员工数量

data ends

table segment
;0123456789ABCDEF
db 21 dup ('year summ ne ?? ')

table ends

stack segment stack
db 128 dup (0)
stack ends

code segment

start: mov ax,stack
mov ss,ax
mov sp,128

mov ax,data
mov ds,ax

mov ax,table
mov es,ax

mov si,0 ;ds:[si]
mov di,84 ;ds:[di]
mov bx,168 ;ds:[bx]
mov bp,0 ;es:[bp]

mov cx,21

inputTable: push ds:[si]
pop es:[bp]
push ds:[si+2]
pop es:[bp+2]

;之后因为被除数为4个字节,32位。需要AX和DX两个寄存器存放,DX存放高16位,AX存放低16位
mov ax,ds:[di]
mov dx,ds:[di+2]
mov es:[bp+5],ax
mov es:[bp+7],dx

push ds:[bx]
pop es:[bp+0AH]

div word ptr ds:[bx]
mov es:[bp+0DH],ax

add si,4
add di,4
add bx,2
add bp,16
loop inputTable

mov ax,4c00h
int 21h

code ends

end start