这个实验我自己摸索了好几个小时才弄出来,最后想通了发现自己把问题想复杂了。

1、个人认为最简单的方法
assume cs:code,ds:data

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,2558,2793,4037,5635,8226
	dw 11542,14430,15257,17800
data ends

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

code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,table
	mov es,ax

	;初始化变量
	mov bx,0  ;table 段的行
	mov si,0  ;操作年份、收入数据的变量
	mov di,0  ;操作雇员数的变量
	mov cx,21
s0:
	;年份存入table段
	mov ax,[si]
	mov es:[bx],ax
	mov ax,[si+2]
	mov es:[bx+2],ax

	;收入存入table段
	mov ax,[si+84]
	mov es:[bx+5],ax
	mov dx,[si+86]
	mov es:[bx+7],dx
	
	;雇员数存入table段
	mov bp,word ptr [di+168]
	mov es:[bx+10],bp
	
	;人均收入存入table段
	div bp
	mov es:[bx+13],ax

	add bx,16
	add si,4
	add di,2

	loop s0

	mov ax,4c00h
	int 21h
code ends
end start

这个实验重点是:对数据的寻址方式,以及合理使用寄存器。

推荐一篇文章:https://www.cnblogs.com/Base-Of-Practice/articles/6883907.html

对上面这两点讲的比较细。弄清楚了这两点,再写代码就清楚了。

2、我第一次写的代码

表示代码逻辑再次看自己都看不懂 :( 哈哈。当时我是想尽量用到那个实验之前学到的所有知识点。事实也是如此我用到了之前学过的绝大部分知识。虽然最后代码逻辑复杂,但是收获满满。

assume cs:code,ds:data,ss:stack

stack segment
	db 200 dup(0)
stack ends

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,2558,2793,4037,5635,8226
	dw 11542,14430,15257,17800
data ends

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

code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	mov ax,table
	mov es,ax
	
	mov di,0 ;全局读取数据的索引变量
	mov bx,0 ;表格行
	push 0   ;先将读取雇员数时的索引变量入栈
	mov cx,21
s0:
	mov si,0 ;表格列
    push di
	push cx
	mov cx,4
	
	;年份
	s1: 
	    mov ax,[di]
		mov es:[bx+si],ax
		inc si
		inc di
	loop s1
	pop cx
	
	;分别用ax、dx储存收入的高四位和第四位
	mov si,0
	pop di
	mov ax,[di+84]
	mov es:[bx+5+si],ax
	add si,2
	add di,2
	mov dx,[di+84]
	mov es:[bx+5+si],dx
	add di,2
	
	;算出人均收入
	pop si
	div word ptr [si+168]

	;雇员数存入table段
	mov dx,word ptr [si+168]
	mov es:[bx+10],dx
	add si,2
	push si

	;人均收入存入table段
	mov es:[bx+13],ax

	add bx,16
loop s0

	mov ax,4c00h
	int 21h
code ends
end start

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《汇编语言(王爽第三版)实验7 寻址方式在结构化数据访问中的应用
   

还没有人抢沙发呢~