汇编语言:实验七 寻址方式在结构化数据访问中的应用

话不多说,上图(原题为王爽老师的汇编语言P161):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Solution

如果用现在的高级语言来完成本题可以说是小菜一碟,但如果是只能使用几个简单的寄存器的和一些基础得不行的汇编语言,笔者作为初学者,认为这个还是有难度的。

如何解决此问题?乍一看这些数据真的是让人眼花缭乱,题中给出的格式更是令本人摸不着头脑,但在一步一步地分析之后,有着一定的高级语言编程基础,便有了这样的感觉:
题中给出的数据段(data segment)分为三大块:

  • 首先是字节型数据,每个元素占 1 个字节,与C语言中的字符类型char相似,如 ‘1975’ 等价于 ‘1’, ‘9’, ‘7’, ‘5’ 四个字符。
  • 第二块是double word 双字类型,每个元素占 4 字节(32 bits),可以类比于C语言中的有符号整型 (signed int 类型)。
  • 第三个类似于第二块数据,同样是整型数据,字(word)类型限制了每个元素的空间为 2 字节。
    这些排列整齐,并且每块都是相同类型的元素也就是高级语言中数组的雏形。
如何访问数组元素?

C语言中我们使用如 arr[ i ] 的方式对每个元素进行访问,在汇编当中有与之相似的方法: address[ offset ], address 表示首地址,offset表示相对于address的偏移

据此,需要求得各个"块"的首地址:

第一块(年份),因为是data segment的首位值,块首地址就是0H,本块共有21个元素,每个元素占 4 字节,那么一共占用 4 * 21 = 84字节,转换为十六进制就是 54H,因此本块占有的空间地址范围为 0 ~ 53H(这里地址是从0开始的,所以只能到53H)
在这里插入图片描述
第二块(公司总收入),同样的计算方式,块首地址是上一块的末端加一,53H + 1H = 54H, 本块也是21个元素,每个元素(double word)占用 4 字节,一共占用 4 * 21 = 84字节,54H + 54H - 1 = A7H;
在这里插入图片描述

第三块(公司雇员人数),同样得到块首地址: A7H + 1H = A8H
在这里插入图片描述

数据拷贝

明白了如何访问,那么接下来就要通过访问完成数据从data段到table段的拷贝,刚开始笔者没想到 es段寄存器,所以傻乎乎地使用了一个段寄存器ds来回切换… …这里介绍直接使用es的更简洁的编写方式。

首先,将两个数据段的首地址写入到 ds、es,以便完成后续地访问工作。
在这里插入图片描述
存储好了段位置,就可以显示地指定想要访问的数据段。
还需要做的一件事是:用寄存器保存各个段的偏移,说白了就是现在知道了数据的大块范围,但是需要的每一个具体的元素,因为8086CPU寄存器最多装入两个字节的数据,因此记录偏移位置是有必要的: 很凑巧的是,对于第一块的数据,每次需要操作 4 个字节,如 ‘1975’, 同样,对于第二块数据,double word 也是每次操作四个字节,所以可以只用一个寄存器表示偏移(每次更新偏移位置都是 + 4,往后偏四个字节即可),对于第三块数据,很遗憾,每次只需要偏移两个字节,与前两块的偏移"速度"不一致,必须额外使用一个寄存器去记录。
在这里插入图片描述

存放年份、公司总收入、公司人数
		;存放年份
	s:	mov ax, [bx]
		mov es:[</
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值