寻址方式在结构化数据访问中的应用
题目: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