美文网首页程序员
直接寻址方式

直接寻址方式

作者: 唐大方 | 来源:发表于2017-04-17 20:58 被阅读0次

    首先需要了解几个内容:

    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#:如果启用了分页机制,那么线性地址是逻辑地址和物理地址之间的中间层。若没有启用分页机制,那么线性地址就是物理地址。

    相关文章

      网友评论

        本文标题:直接寻址方式

        本文链接:https://www.haomeiwen.com/subject/rxlxzttx.html