寻址方式小结

最近在复习Intel8086的汇编语言,写了点小结,在此和大家分享,如果有不对的地方,希望大家指点。

————————下面开始正文————————

一、首先了解一下指令各个部分的定义:

MOV AL, 07H;
MOV为助记符,AL为目的操作数,07H为源操作数

操作数按种类分:目的操作数,源操作数
操作数按内容分:内容可以是操作数,也可以是操作数的地址

关于操作数进一步的理解可以进链接看用户【三年期、】的回答

二、了解一下寻址的概念

寻址顾名思义,寻找地址,寻找操作数的地址,而寻找操作数的方式就叫寻址方式。

问:一条指令里有两个操作数啊,该怎么确定这条指令是什么寻址方式呢?
答:寻址方式不是针对一条指令而言,而是针对某个操作数而言,题目提问的时候会说明“请指出下列指令中(或者目的)操作数的寻址方式”。

三、立即寻址和寄存器寻址

立即寻址:操作数直接出现在指令中

eg: MOV AL, 07H
在指令中得到立即数07H,送到AL中
指令中的源操作数为立即寻址

寄存器寻址:操作数在寄存器中

eg: MOV CL, BL
将BL的内容取出,送到CL中
指令中的源操作数目的操作数都为寄存器寻址

四、存储器寻址

存储器寻址较复杂,所以单独拎出来

(一)、定义

教科书上的两点定义
1.在存储器寻址中,操作数放在存储器中,CPU取出指令后,为了获得操作数(对于源操作数而言),或操作数的存放地址(对于目的操作数而言),还要再次访问存储器。
2.存储器寻址既可以用于源操作数,也可以用于目的操作数。
但是两操作数不能同时使用存储器寻址方式,网上的回答是:为了减少硬件设计的复杂度,便于流水线的设计。

(二)、有效地址

谈到存储器寻址就离不开 [有效地址]

有效地址的各个部分:

[有效地址] = [基址 + 变址 + 位移量] ;别忘了中括号
表示有效地址时:
1.中括号内只能用基址或变址寄存器BX、BP、SI、DI;
2.只要使用了BP,那么默认段寄存器则为SS,否则为DS;
3.使用段超越时,自己指定段寄存器。

(三)、根据操作数的有效地址的不同表达式进行细分

1.直接寻址:有效地址直接在指令中给出,CPU按照有效地址去存储器找操作数

eg1.1: MOV AL, [2000H]
将DS中偏移地址为2000H指向的字节内容取出,送到AL中
指令中的源操作数为直接寻址


eg1.2: MOV [2000H], BX
将BX的字取出,低8位送给DS中偏移地址为2000H指向的位置,高8位送给DS中偏移地址为2001H指向的位置
指令中的目的操作数为直接寻址

2.寄存器间接寻址:有效地址只由寄存器表示

eg2.1: MOV AX, [BX]
将DS中偏移地址为BX内容指向的字取出,送到AX中
指令中的源操作数为寄存器间接寻址,目的操作数为寄存器寻址


eg2.2: MOV [BX], AX
将AX的内容取出,送到DS中偏移地址为BX内容指向的位置
指令中的目的操作数为寄存器间接寻址,源操作数为寄存器寻址,


注意区分寄存器寻址和寄存器间接寻址

3.基址寻址:有效地址同时由基址寄存器和位移量表示

eg3.1: MOV [BP + 1200H], DX
将DX的内容取出,送到SS中偏移地址为[BP内容加1200H之和]指向的位置
指令中的目的操作数为基址寻址


eg3.2: MOV SI, DS:[BP + 30H]
将DS中偏移地址为[BP内容加30H之和]指向的内容取出,送到SI中
指令中的源操作数为基址寻址
这里使用段超越将原本默认的SS改成了DS

4.变址寻址:有效地址同时由变址寄存器和位移量表示

eg4.1: MOV DL, [SI + 2AH]
将DS中偏移地址为[SI内容加2AH之和]指向的内容取出,送到DL中
指令中的源操作数为变址寻址


eg4.2: MOV BYTE PTR[DI + 2500H], 90H
在指令中得到立即数90H,送给DS中偏移地址为[DI内容加2500H之和]指向的位置中
指令中的目的操作数为变址寻址
由于两个操作数都不能确定字长,所以用PTR将目的操作数定义为BYTE类型

5.基址加变址寻址:有效地址中只要基址和变址同时出现,不论有没有位移量,都属于此类

eg5.1: MOV CL, [BX + SI + 05H]
将DS中偏移地址为[BX内容加SI内容加05H之和]指向的内容取出,送到CL中
指令中的源操作数为基址加变址寻址


eg5.2: MOV WORD PTR[BP + DI], 3000H
在指令中得到立即数,送给SS中偏移地址为[BX内容加DI内容之和]指向的位置中
指令中的目的操作数为基址加变址寻址
由于两个操作数都不能确定字长,所以用PTR将目的操作数定义为WORD类型

五、其他要注意的地方

1.立即数不能直接送到段寄存器中
2.不能在两个段寄存器之间传送数据
3.有效地址不能同时由两个基址寄存器(BX、BP)或者由两个变址寄存器(DI、SI)表示
4.两操作数不能同时为存储器寻址
5.6.7.8.9.10……

以上总结的知识点主要是对数据传送指令而言,可能有一定的局限性,请大家理性学习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值