汇编学习-16汇编指令中的内存寻址

汇编学习-16汇编指令中的内存寻址如是下 8086CPU 中所有的寄存器 这些寄存器中大部分都和寻址有关 其中可以用于寻址的寄存器有 bx bp si di 指的是可以写在的寄存器

大家好,欢迎来到IT知识分享网。

CPU用于寻址的寄存器

  1. 如是下8086CPU中所有的寄存器,这些寄存器中大部分都和寻址有关
汇编学习-16汇编指令中的内存寻址

  1. 其中可以用于寻址的寄存器有bx,bp,si,di,指的是可以写在[]的寄存器

– bx是通用寄存器,但是可以用于内存寻址,一般作为基址使用

– bp是用于内存寻址的寄存器,一般作为基址使用。

– si和di是变址寄存器,作用类似bx,但是si和di不能拆分成8位寄存器

– si,source index,源变址寄存器

– di,destination index,目标变址寄存器

不同的寻址方式

1.官方课件中提到的不同形式的寻址方式,非常多,非常灵活

汇编学习-16汇编指令中的内存寻址

汇编学习-16汇编指令中的内存寻址

  1. 个人不建议按照上面的思路去记,太多,太灵活,不容易记忆。推荐用我的思路记录。内存操作中就几个场景,读内存数据,写内存数据,读栈数据,写栈数据。

– 源数据段定位,ds:[bx+si+idata]括号内的值可以减少,例如:ds:[bx+idata],这些寄存器可以理解成全部是源定位。

– 目标数据段定位,es:[bp+di+idata]括号内的值可以减少,例如:es:[bp+idata],这些寄存器可以理解成全部是目标定位。

– 栈段数据定位(作为源),ss:[bx+si+idata]

– 栈段数据定位(作为目标),ss:[bp+di+idata]

  1. 它们之间的组合只有如下几种

– 读内存

– 读内存->写入内存

– 读内存->写入栈

– 读栈

– 读栈->写入内存

– 写入内存

– 写入栈

  1. 强烈建议按照我的格式去写,不要es:[bx+di+idata]这样混写,虽然不报错,但是后期分析代码会非常困难。按照我的格式写,读内存,还是读栈,写内存,还是写栈会非常清晰,只需要根据实际需求调整基址,变址,直接数的组合即可。

– 读取就是ds,bx,si,idata的组合

– 写入就是es,bp,di,idata的组合

– 因为栈只有一个ss,所以栈根据出向和入向和后面的几个寄存器组合就行

  1. 另外课件中提到了很多内存寻址的书写格式,但是还是强烈建议按照ds:[bx+si+idata]格式书写,方便阅读和分析,课件上提到的格式能理解就行,不理解也没事,以后只可能出现在别人写的代码里,那个格式不清楚上网查下就行了,具体格式有如下:

– mov ax,[idata+bx]

– mov ax,idata[bx]

– mov ax,[bx].idata

– mov ax,[bx].idata[si]

– mov ax,[bx][si].idata

– mov ax,idata[bx][si]

样例

样例一

  1. 第一组数据大写转小写,第二组数据小写转大写
汇编学习-16汇编指令中的内存寻址

  1. 观察数据端的特点,两组数据长度都是6字节,所以可以使用6次循环,但是第一个数据和第二个数据段的起始不一样,所以需要[idata+bx]的寻址格式
  2. 验证代码的执行结果
汇编学习-16汇编指令中的内存寻址

样例二

  1. 将第一组数据复制到指定的内存空间中,这个场景的思路是第一个场景的一部分,整理代码如下
汇编学习-16汇编指令中的内存寻址

  1. 使用debug进行验证,结果正确。这样里比较简单
汇编学习-16汇编指令中的内存寻址

  1. 换一个样例试下,把当前段的数据复制到指定段中(意思就是段地址也改动),首先理解这个需求,我们需要一个寄存器保存目标端的信息,其他的即使正常复制即可,目标端寄存器使用es,整理代码如下
汇编学习-16汇编指令中的内存寻址

  1. 执行代码,验证结果。首先确认原始数据(注意100H的段前缀),复制成功后两部分的数据是一样的。
汇编学习-16汇编指令中的内存寻址

样例三

  1. 如下样例是课件上的一个样例,完成每行首字母的大写,确保每行16个字符,这样在观察的时候会简单点。这个跟第一个样例原理一个,每行(16)数据的第4个字符做小转大,就是[bx+idata]模型
汇编学习-16汇编指令中的内存寻址

  1. 整理代码如下
汇编学习-16汇编指令中的内存寻址

  1. 使用debug进行验证,直接显示结果
汇编学习-16汇编指令中的内存寻址

样例四

1.这个也是课件上的一个样例,这个样例是把每行的单词改成大写字母,这里需要判断每个单词的长度,这个样例的四行字母长度都是3,所以可以使用双层循环来做。

汇编学习-16汇编指令中的内存寻址

  1. 本来计划双层循环放在一个代码体里顺序执行,模拟循环故障,感觉没有必要。直接整理了一份正常代码。这种方式是临时变量保存法,第一次写类似的代码脑子有点转不过来,所以后面把代码拆分具体讲解下。
  2. 首先定义开头部分,开头部分是寄存器初始话,这段不会有歧义
汇编学习-16汇编指令中的内存寻址

  1. 然后是循环点的判断和循环变量的判断,行号会变化,每次增加16,这是一个循环变量,字符的内存位置会变化,由0变化到2总共3位,这是一个循环变量。先把这段代码写出来。大概这个样子
汇编学习-16汇编指令中的内存寻址

  1. 然后补充功能代码,就是小写转大写的代码。如下是没有触发循环的状态。
汇编学习-16汇编指令中的内存寻址

  1. 再后面是找循环点,这个很重要。循环点就是从那个点开始循环,我的查找方式是循环变量变化后第一行进入的代码,以si为例,这个是内存的位置,内存位置变化了会直接触发那行代码,这里我们通过常规逻辑去思考,内存地址变化了是不是就是找到另外一个字符了,哪一行代码代表这个意思哪?分析后发现是mov dl,ds:[bx+si]这行代码在生效。把这个循环点补充完毕后跟一遍代码,发现内层循环的逻辑好像通了。
汇编学习-16汇编指令中的内存寻址

  1. 按照之前的思路这段代码需要双循环才能实现,所以还有一个循环点,按照刚才的逻辑定位另外一个循环点。一行代码处理完毕后该干什么,是不是需要初始化到另外一行的行首,对应到我们的代码是不是mov si,0,我们先把循环点点在这里,然后跟一遍代码,看看有没有问题。
汇编学习-16汇编指令中的内存寻址

  1. 使用debug工具进行跟踪查看,实际情况是loop s1执行结束,这个时候cx已经等于0了,会导致外层循环也结束,只有第一行数据被转换成大写,程序结束。
汇编学习-16汇编指令中的内存寻址

  1. 由于cx等于0后直接导致双层循环都结束了,所以为了保障外层循环还能够继续执行,需要在下图的两个位置将外层的cx想办法再补充出来。
汇编学习-16汇编指令中的内存寻址

  1. 思路就是在内层cx被重置前先找一个临时变量保存外部的cx,等内存循环结束后再把临时变量赋值给cx。临时保存和释放都需要在外部循环中。
汇编学习-16汇编指令中的内存寻址

  1. 使用debug执行代码,观察结果正常。
汇编学习-16汇编指令中的内存寻址

样例五

  1. 样例四的需求,使用压栈出栈的方法实现双层循环
汇编学习-16汇编指令中的内存寻址

  1. 思路是把刚才双循环寄存临时变量的地方替换成入栈和出栈就可以了。汇编中的压栈和出栈就是保存一些临时数据(压栈),当代码执行到恰当的时候需要这些数据时把它释放出来(出栈)。汇编中的压栈只能保存寄存器或者idata,不能保存汇编指令。
汇编学习-16汇编指令中的内存寻址

  1. 使用debug工具运行程序,观察结果也执行成功了
汇编学习-16汇编指令中的内存寻址

样例六

  1. 课件中的一个示例,提到了结构体的概念,课件中没有展开讲,个人粗浅的理解是一些内存按照一定的格式组合成了特殊的数据类型,比如:数组。
  2. 课件作业的具体内容如下,将姚明号码15->11,得分32->13,球队shh->hou
汇编学习-16汇编指令中的内存寻址

  1. 课件中是从原始修改数据开始的,并没有准备数据的代码,我们自己做测试是需要自己准备数据,自己进行测试的,所以数据的写入也是练习项之一
  2. 整理代码如下,先准备了一个错误的示例
汇编学习-16汇编指令中的内存寻址

  1. 执行结果如下,结果看起来没问题,该修改的都被修改了。问题出在处理HOU时的idata偏移地址,13(得分)是一个word类型会占两个字节,但是在修改HOU时只增加了1的偏移亮,所以导致了13的高位地址被H占掉了。
汇编学习-16汇编指令中的内存寻址

  1. 如果是修改后的代码,我把注意事项全部写在代码中了,60不是60b
汇编学习-16汇编指令中的内存寻址

  1. 执行结果如下,跟预期是一样的
汇编学习-16汇编指令中的内存寻址

  1. 另外再准备一个16进制的版本,平时我们写代码的时候可能会按照10进制去写,但10进制可能会导致我们对byte或者word类型判断不准,例如:定义数字时255以下一个字节就可以了,但是如果超过了255就需要用word的类型,同理还有dd类型。
汇编学习-16汇编指令中的内存寻址

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/185710.html

(0)
上一篇 2025-08-12 11:10
下一篇 2025-08-12 11:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信