直接寻址方式

首先需要了解几个内容:

1、机器指令包含的两部分:一部分是指令要完成的操作,称为指令操作码部分;另一部分是参与操作的对象,称为操作数部分,可以直接给出操作数的值或操作数的地址信息。

2、有效地址(EA):处理器通过指令字提供的地址信息求出存放操作数的地址,称为有效地址。

寻址方式:查找操作数或求出操作数有效地址的方法,称为寻址方式。

寻址有数据寻址程序寻址

数据寻址方式主要有3大类:

操作数直接包含在指令中、包含在处理器某个内部寄存器中、包含在存储器中

“操作数包含在存储器中”的寻址方法,也可以称为存储器寻址方式,主要有9种。

第一种:直接寻址方式

指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址称为直接寻址方式。

通常情况下,操作数存放在数据段(DS)中(也可以显式地指定其他段),所以,其线性地址将由数据段寄存器DS和指令中给出的有效地址直接形成,例如:

1、INC WORD PTR [500H];

该指令的有效地址即偏移地址500H。

线性地址=数据段基址(DS*16)+偏移地址(500H)

2、MOV AX, [2000H] ;

线性地址=数据段基址(DS*16)+偏移地址(2000H)

将有效地址(偏移地址)2000H字单元中的内容传送到AX寄存器中。

#1:如果使用段超越前缀,那么,操作数可存放在其它段。

例如,要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

下面指令的目标操作数就是带有段前缀的直接寻址方式。

MOV ES:[1000H], AX

#2:中括号在指令中的区别

#2-0:立即数寻址方式和直接寻址方式:

写在括号“[”,“]”内的数值代表直接寻址的地址,没有括号“[”,“]”代表立即数寻址的操作数。

mov eax,[2H]   eax==(DS*16+2H)中的内容传送到AX寄存器中。

mov eax,2H         eax==2H

#2-1:mov指令下的变量:

num dword 2

mov ebx,num   ebx==2

mov ecx,[num]  ecx==2

对于变量来说,加不加中括号,都是取值而不是取地址。

#2-2:mov指令下的寄存器:

mov ebx,eax      ebx==eax

mov ecx,[eax]  ecx==(DS*16+eax)中的内容传送到ecx寄存器中。如果eax的值过大,可能会报错。

对于寄存器来说,加中括号等于直接寻址。

#2-3:lea指令下的变量:

num dword 2    假设num地址是0x00574675

lea ebx,num      ebx==0x00574675

lea eax,[num]    eax==0x00574675

对于变量来说,加不加中括号,都是取地址。

#2-4:lea指令下的寄存器:

mov eax,2

lea ebx,[eax]     ebx==2

lea ebx,eax; 编译器报错: error A2070: invalid instruction operands

对于寄存器来说,加中括号是取寄存器中的值,不加中括号会报错。

3#:如果启用了分页机制,那么线性地址是逻辑地址和物理地址之间的中间层。若没有启用分页机制,那么线性地址就是物理地址。

你可能感兴趣的:(直接寻址方式)