实验七:寻址方式在结构化数据访问中的应用
编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
提示,可将data段中的数据看成是多个数组,而将table中的数据看成是一个结构型数据的数组,每个结构型数据中包含多个数据项。可用bx定位每个结构型数据,用idtaa定位数据项,用si定位数组项中的每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式。
可以把年份,总收入,雇员数,人均收入看成一整个结构。
{ ‘1975’,16, 3, ?}就是一个结构,同理 {1976, 22, 7, ?}也是一个结构。
年份,总收入雇员数,人均收入就是其中的项。
在结构{ ‘1975’,16, 3, ?}中’1975’,16,3,?都是它的项。
项中也有元素。
‘1975’是4个字节,第一个字节是’1’,ASCII码是31h,这个’1’就是它的元素。
对于data中的数据,用bx来定位每一个结构,用idata来定位项,用si来定位项中的元素。
对于table中的数据,因为没有那么多的寄存器,用bp来定位每一个结构,bp + 偏移地址来表示所有的东西。
assume cs:code, ds:data, es:table, ss:stack
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'
; 每一个字符都是一个ASCII码占一个字节,4*21 = 84字节
;54h是下面的开始
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590287, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
; 21个双字, 4*21 = 84字节
;54h + 54h是下面的开始
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
; 21个字, 42字节
;54h+54h+2ah是后面的开始
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
stack segment
stack ends
code segment
start: mov ax, data
mov ds, ax
mov bx, 0 ;定位data结构型数据
mov si, 0 ;定位数据项中的每个元素
mov ax, table
mov es, ax
mov bp, 0 ;定位table结构型数据
mov ax, stack
mov ss, ax
mov sp, 2
mov cx, 21
s: mov ax, ds:[bx].0[si] ;ds + 0 + si定位,找到年份的低字节
mov es:[bp], ax ;bp定位,低字节拷入
mov ax, ds:[bx].0[si + 2] ;高字节
mov es:[bp + 2], ax
mov ax, ds:[bx].84[si]
mov es:[bp + 5], ax ;拷入收入低字节
mov dx, ds:[bx].84[si + 2]
mov es:[bp + 7], dx ;拷入收入高字节
push cx ;因为被除数是4字节,所以要用dx存高位,ax存低位,所有16位寄存器(ax,bx,cx,dx,si,di)都在使用,只能用栈暂存了
mov cx, ds:[84 + 84 + di] ;84+84是雇员的地址,也就3,7,9……中3所在的位置,循环一次加一个字,也就是二个字节
mov es:[bp + 0ah], cx
div cx
pop cx
mov es:[bp + 0dh], ax ;div结果在ax中
add di, 2 ;雇员地址,一次加2个字节
add bx, 4 ;bx是年份,一次加4个字节
add bp, 16 ;bp是table年份的首地址,一次加10h
loop s
mov ax, 4c00h
int 21h
code ends
end start