首先需要了解几个内容:
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#:如果启用了分页机制,那么线性地址是逻辑地址和物理地址之间的中间层。若没有启用分页机制,那么线性地址就是物理地址。
网友评论