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

分析:

该实验时之前以来最难的一次试验了,很多第一次都是难以做出来的(大神别见怪。

我们先分析一下数据段,前两个其实都是4个字节,别被db给骗了,因为是字符串,所以4个字节

然后dw为两个字节,你会发现前两个的某个地址为dw地址的两倍。比如1976的地址为4,对应22,但是对应dw中的7地址却为2.    这个时候我们就可以用bx设置为dw的起始地址,然后si+bx为前面两个的起始地址就行了 (si+bx) = 2*bx

然后用bp来确定table的起始地址,因为题目已经给明白第一行为0,第二行为10h,所以每次加10h就ok了


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'
	;以上表示年份
	
	dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
	dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
	;以上表示21年公司总收入dword数据
	
	dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
	dw 11542,14430,15257,17800
	;以上表示21年公司库佣人员的21个word数据
data ends

table segment
	db 21 dup('year summ ne ?? ')
table ends

codesg segment
start:
	mov ax,data
	mov ds,ax	;ds为data段
	mov bx,0
	mov si,bx
	
	mov ax,table
	mov es,ax	;es为table段
	mov bp,0
	
	mov cx,21	;循环21次
s:	mov ax,0[bx+si]
	mov es:[bp],ax
	mov ax,0[bx+si+2]
	mov es:[bp+2],ax	;移入年份
	
	mov ax,84[bx+si]
	mov dx,84[bx+si+2]	;因为要除法,所以这样移动
	mov es:[bp+5],ax
	mov es:[bp+7],dx	;移入收入
	
	div word ptr 168[bx]
	mov es:[bp+13],ax	;先移入人均收入
	
	mov ax,168[bx]
	mov es:[bp+10],ax	;移入人员数
	
	add bx,2	;人员数的地址
	mov si,bx	;上面两个的地址
	add bp,10h
	
	loop s 
	
	mov ax,4c00h
	int 21h
	
codesg ends
end start


结果如下:


猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80717247