寻址方式在结构化数据访问中的应用
题目: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 ?
下面的程序中,已经定义好了这些数据:
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'
; 以上是表示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,11430,15257,17800
; 以上是表示21年公司雇员人数的21个word型数据
data ends
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:0 '1975' 16 3 ? Table:10H '1976' 22 7 ? Table:20H '1977' 382 9 ? Table:30H '1978' 1356 13 ? Table:40H '1979' 1390 28 ? Table:50H '1980' 8000 38 ? : Table:140H '1995' 5937000 17800 ?
提示:可将data段中的数据看成是多个数组,而将table中的数据看成一个结构型数据的数组,每个结构型数据中包含多个数据项。可用bx定位每个结构型数据,用idata定位数据项,用si定位数组项中每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式。
注意,这个程序是到目前为止最复杂的程序,它几乎用到了我们以前学过的所有知识和编程技巧。所以,这个程序是对我们从前学习的最好的实践总结。请认真完成。
assume cs:code, ds:data, es:table, ss:stacks
;编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整)
;结果也按照下面的格式保存在table段中
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 sumn ne ?? ')
table ends
stacks segment
dw 128 dup(0)
stacks ends
code segment
start:
mov ax,data
mov ds,ax ;设置DS的段地址
mov ax,table
mov es,ax ;设置ES的段地址指向table
mov ax,stacks
mov ss,ax ;设置SS的段地址
mov sp,128 ;设置SP的栈顶指针
mov bx,0 ;目标结构元素首地址的移动
mov si,0 ;数据偏移地址的移动
mov di,0 ;目标偏移地址的移动
mov bp,0
mov cx,21
inputTable:
push cx
mov cx,2
mov di,0
;复制年份和收入
inputYandS:
mov ax,ds:[0+si]
mov es:[0+bx+di],ax
mov ax,ds:[84+si]
mov es:[5+bx+di],ax
push ax ;将总收入的高低16位分别压栈
add si,2
add di,2
loop inputYandS
;复制员工人数
mov ax,ds:[168+bp]
mov es:[10+bx],ax
add bp,2
;计算人均收入
pop dx
pop ax
div word ptr es:[10+bx]
mov es:[13+bx],ax
add bx,16
pop cx
loop inputTable
mov ax, 4C00H
int 21H
code ends
end start
