利用汇编语言实现数据存储 | 汇编语言(王爽版)实验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'
;年份
  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 summ ne ?? ')
table ends

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
在这里插入图片描述

提示:可将data段中的数据看成是多个数组,而将table中的数据看成是一个结构型数据的数组,每个结构型数据中包含多个数据项,可用bx定位每个结构型数据,用idata定位数据项,用si定位数组项中每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式。

1.源数据在哪里

年份:0-53H(每个年份4个字节,一共有21个年份,21 * 4=053H)
收入:54H-0A7H (21个dd型,dd型占4个字节,54h+54h=A8h)
雇员:0A8H-0D1H(21个dw型,21 * 2=2Ah,0A8h+2Ah=0D2h)

2.目标存放位用什么来表示

原始数据存放在ds里面,目标存放位用ES来表示

3.初始化阶段

mov ax,data
mov ds,ax
mov ax,table	
mov es,ax		;ds已被占用

mov bx,0		
mov si,0
mov di,0
mov cx,21	;21次循环

4.每次循环要执行的任务

  • 存放年份
  • 存放公司收入
  • 存放雇员数
  • 计算人均收入并存放

存放年份

mov al,[bx]		;每个年份由四个字节单元组成,依次存放四个字节单元数据进es:[di]处
mov es:[di],al

mov al,[bx+1]
mov es:[di+1],al

mov al,[bx+2]
mov es:[di+2],al

mov al,[bx+3]
mov es:[di+3],al

存放公司总收入

mov ax,54h[bx]		;低16位
mov dx,56h[bx]		;高16位
mov es:5h[di],ax		
mov es:7h[di],dx

存放雇员数

mov ax,0A8h[si]
mov es:0Ah[di],ax

计算人均收入并存放

mov ax,54h[bx]		;总收入作为被除数
mov dx,56h[bx]
div word ptr ds:0A8h[si]		;总收入除以人数
mov es:0dh[di],ax		;商放入目标位置

为下一次循环时存放数据做准备

add bx,4	;	bx确定年份和收入,年份是'db'*4,收入是'dd'
add si,2	;	si确定人数
add di,16	;	di确定的是行数

编程实现:

assume cs:codesg,ds:data,es: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 summ ne ?? ')
table ends

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

	mov bx,0		
	mov si,0
	mov di,0
	mov cx,21	;21次循环
s0:
	mov al,[bx]		;存放年份
	mov es:[di],al
	mov al,[bx+1]
	mov es:[di+1],al
	mov al,[bx+2]
	mov es:[di+2],al
	mov al,[bx+3]
	mov es:[di+3],al

	mov ax,54h[bx]		;存放公司收入
	mov dx,56h[bx]		
	mov es:5h[di],ax		
	mov es:7h[di],dx

	mov ax,0A8h[si]		;存放雇员数
	mov es:0Ah[di],ax

	mov ax,54h[bx]		;人均收入
	mov dx,56h[bx]		;总收入作为被除数
	div word ptr ds:0A8h[si]		;总收入除以人数
	mov es:0dh[di],ax		;商放入目标位置

	add bx,4	;	bx确定年份和收入,年份是'db'*4,收入是'dd'
	add si,2	;	si确定人数
	add di,16	;	di确定的是行数

loop s0
mov ax,4c00h
int 21h
codesg ends
end start

5.上机结果

1.查看初始状态下的data段数据
在这里插入图片描述
2.查看初始状态下的table段数据
在这里插入图片描述
3.查看程序运行结束后的table段数据
在这里插入图片描述
在这里插入图片描述

6.实验小结

编写程序前把程序分块,每一块的功能单独列出来,再依据功能编写相对的代码,对编程的效率有很大提高。Debug载入程序后查看data段和table段的初始数据,发现和预期不符。之后才发现是没有运行程序的前几行使data段与ds,table段与es挂钩。对于循环体使用-p命令可以节省运行时间。

发布了118 篇原创文章 · 获赞 84 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43092232/article/details/105507528
今日推荐