最近在复习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……
以上总结的知识点主要是对数据传送指令而言,可能有一定的局限性,请大家理性学习。