微机学习:第十课

本文详细解析了存储器寻址的六种方式:直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址,以及不同类型的地址表示。通过实例和分析深入探讨了各种寻址方式的工作原理和应用。

1、直接寻址

这种寻址方式是对存储器访问时可采用的最简单的方式,存储单元的地址由指令直接给出。
例如:
MOV AX,[1070H] 将DS段的1070H和1071H两个单元的内容取到AX中
MOV EAX,ES:[1000H] 将ES段的1000H开始的4个字节的数据传到EAX中。

2、寄存器间接寻址

存储单元的有效地址由寄存器指出,这里需要注意的地方就是寄存器的使用规则:
①BP/SP对应的默认段寄存器为SS
②IP对应的默认段寄存器为CS
③其他寄存器(如AX、CX)对应的段寄存器默认为DS(理论上ES也是阔以的)
例如:
MOV AX,[BX] 将DS段中由BX所指地址开始的两单元的内容送入AX
再例如,如果是对非默认段进行寻址,那么必须在指令前用前缀指出段寄存器名:
MOV CX,ES:[BX] 将ES段由BX所指单元开始的2个字节送到CX

还是得注意一下形式,BX是需要用[]括起来的,这样的意思才能是指向内存。

来个简单的题目:
例题
已知(BP)=0001H,(0001H)=35H,(0002H)=00H,那么在执行完MOV AX,[BP]后,AX的值为?
分析: 很简单,BP的默认段寄存器就是SS,根据题意就可以得到SS的在0001H为存储单元内容为35H,而观察目的操作数AX可知道我们需要传入的数据总共是2个字节的,因此以0001H位起始存储单元(1字节),继续向上找一个存储单元0002H,该单元的内容为00H,那么最终2个字节的内容传入到AX中就是0035H,00H在AH,35H在AL(这个过程满足高字节存放在高地址,低字节存放在低地址的原则)。

3、寄存器相对寻址

在指令中给定一个基址寄存器(或变址寄存器)和一个8位或16位的相对偏移量,两者之和作为操作数的有效地址。
其实直接上个例子来理解更直接:
MOV AX,[SI+100H] 假设SI为2000H,那么意思为对应的段寄存器DS的2100~2101H中的内容送入AX。

再给个课堂上的简单例题:
例题
设执行前:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H。
执行指令:ADD 6[BX],AX
求执行后,(AX)=? (BX)=? (DS)=? (20036H)=?

分析: 一开始看到还是愣住了那么一下,然后老师讲了6[BX]就等同于[BX+0006H],那这个题目就很容易了。首先目的操作数指代的显然就是DS段的0036H处的内存单元,其物理地址将DS左移4位加上偏移量得到20036H,这个物理地址的地盘对应的原数据为0050H,通过ADD语句将(AX)的内容0040加到这里,即0050+0040=0090H,最终得到的结果,其余都不变,只有(20036H)变为了0090H。
注意一下,这里的AX并没有加上[],那就是直接指代AX寄存器的内容。

4、基址加变址的寻址

顾名思义,就是将基址寄存器和变址寄存器组合起来构成有效地址的寻址方式。
基址寄存器为BX/BP,变址寄存器为SI/DI。
书写的形式:
①MOV AX,[BX][SI]
②MOV AX,[BX+SI]

5、相对的基址加变址寻址

这个就把前面的综合一下就好,类似这么写:
MOV AX,[BP+SI+0050H]

6、关于地址的寻址

1、一般寻址:
(1)立即寻址:操作数的地址在指令中直接给出
MOV AX,OFFSET DATA
其中,OFFSET只能作用于直接的存储器符号(变量)
(2)存储器寻址:用特定的指令取存储单元的有效地址
例如:LEA AX,[BX+SI]
这个LEA指令一出,就知道我们取的是有效地址即偏移量了,不要再去找什么默认段寄存器了,就是把BX+SI的值给到AX即可。

寻址的关键当然是获得正确的有效地址了,下面的表示法表示的就是同一有效地址:
[BX+SI+2] [BX+2+SI] [BX+2][SI]
[BX][SI+2] [BX][SI]+2 2[BX][SI]

剩下讲的就是MOV指令的使用规则:
在这里插入图片描述
通过图可以概括出以下几点:
①立即数不能做目的操作数,CS、IP和EIP也不能作为目的操作数,即它们的值不能随意修改,同时IP还不能做源操作数
②两个内存单元之间,以及两个段寄存器之间不能直接传数据
③立即数不能直接传送给段寄存器,必须要通过寄存器传送给段寄存器

着重讲几个稍微隐蔽一点的指令错误:
MOV MYDATA[BX][DI] ES:AX 这条指令的AX并没有被[]包含,那么指的就是ES段下的寄存器,但是ES并不包含AX,可以把指令修改为EX:[AX]
MOV AX [SI][DI] SI、DI不能同时用于目的或源
同理
MOV AX,[BX][BP] BX、BP不能同时用于源或目的

最后就是个例题:
在这里插入图片描述
只要上课听懂了,真觉得这个是很简单的,算了三次以后是同一个答案,自信答题,发现我还是第一个答题的,说明自己还是掌握的不错的。
分析:
执行完①②,则SI=1000H,DI=2000H。
执行完③,则把SI对应的默认段寄存器DS拿来求物理地址得到26000H,通过图可以知道这个物理地址对应的数据是31H,把这个8位数据传入AL刚刚好,那么AL=31H
执行④,目的操作数DI对应的默认段寄存器还是DS,求得物理地址为27000H,把AL的数据传到DI中,那么(27000H)=31H
执行⑤,[SI+1]为1001H,对应段DS求物理地址为26001H,(26001H)=32H,那么显然AL=32H
执行⑥,目的操作数的物理地址求解为27001H,那么(27001H)=32H
执行⑦,BUFFER1前面可没有OFFSET哦,老老实实算得物理地址为26000H,易得AL=31H

最终答案:
AL=31H SI=1000H DI=2000H 27000H=31H 27001H=32H

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

布布要成为最强的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值