汇编语言实验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	?

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

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

发布日期:

所属分类: 易语言 标签: