寄存器寻址方式

    技术2022-05-20  39

    寄存器和寻址方式

        寄存器,8086/8088,有三组共1316位寄存器.

        寄存器,从名字上看,可以知道,它就象书店的行包寄存处,寄存器的名字就象寄存处发给用户取回自已物件的标志牌子,表示物件的存放地址.

        寄存器的内部给构都相同,只不过是一个二字节或一字节的存储空间,别看他们小,作用可大了,所有电脑的运算,都要从他们过关,因为他们的处理速度快嘛.为了区分和准确运用,就要给他们进行科学的分组和起名.

        第一组,数据寄存器,AX,BX,CX,DX.

        其中,X表示一个未知数,那么这些寄存器都可以用来存放数据,ABCD,虽说都可以理解为一个顺序号,但是,A还是加法ADD的简称,所以AX叫累加器,B是基地址的简称,所以BX可以叫基地址寄存器,C是计数器的简称,所以CX可以叫做计数器.D是数据DATA的简称,所以DX可以叫数据寄存器.这四个寄存都可以按高八位和低八位分成两个寄存器:AH,AL,BH,BL,CH,CL,DH,DL.

        第二组,地址指示和变址寄存器,SI,DI,BP,SP.

        它们用来表示一个地址偏移,或用来表示一个地址的变化状况.SI,DI都可以表示变址,在串操作中,SIDI表示源和目的操作数的指示器,快速记忆方法:SI联想饮水思源的思(谐音SI),DI联想目的(谐音DI).

    BP,SPP表示堆栈专用,BP表示基地址专用,SP则是堆栈顶指示器.其中,BP,SI,DI还可以兼作数据寄存器.SP则只能和堆栈绑定.

        第三组,段寄存器,CS,SS,DS,ES.

        它们用来存放CPU可以直接访问的四个当前段的段首地址.CS代码段,SS堆栈段,DS数据段,ES附加段.其中,在表示地址时,CS和指令指示器IP绑定使用,SSBP绑定.DSSI,DI,BX共用.

        第四组,指令指示器,IP,这是CPU自动引用的,表示下一次要从主存取出的指令的偏移.

        寻址方式

    寻址方式分为六种,(这是教材里讲的).

    1,立即寻址,          数据的本身在代码段.用于赋初值.

    2,直接寻址,          数据的偏移在代码段,用于变量名.

    3,寄存器寻址,        数据的本身在寄存器.用寄存器名表示.

    4,寄存器间接寻址,    数据所在存储单元的地址在某个寄存器中.

    5,寄存器相对寻址,    数据的偏移在寄存器.注意:BPSS绑定.DSSI,DI,BX共用.

    6,变址寻址,          数据的偏移在一个寄存器里,并要加上一个偏移量.注意:BPSS绑定.DSSI,DI,BX共用.

    7,间接寻址,          指令中给出数据的地址的地址.

    8,基址加变址寻址,    数据的偏移放在两个寄存器中,并要加上一个偏移量.注意:BPSS绑定.DSSI,DI,BX共用.BXDS段的基址专用.

     

    寻址方式是汇编语言的重点和难点。请按如下思路学习:

    1. 操作数可以存在什么地方?

        ⑴ 操作数存在于指令代码中,处理器译码时就立即获得了这个操作数,这就是立即(数)寻址方式。汇编指    令中,这个立即数(操作数)以常量形式出现。MOV EAX,94H

        ⑵ 操作数存在于处理器内部寄存器中,处理器从寄存器中获得这个操作数,这就是寄存器寻址方式。汇编指    令中,这个寄存器操作数以寄存器名形式出现。MOV EAX,EBX

        ⑶ 操作数存在于主存中,处理器从主存单元获得这个操作数,这就是存储器寻址方式。汇编指令中,这个存    储器操作数以主存地址形式出现。

    2. 8086/8088处理器的主存地址在程序设计时采用逻辑地址。逻辑地址分成段地址和偏移地址两部分。

    3. 存储器寻址方式表达存储器地址时,段地址在默认的或段超越前缀指令指定的段寄存器中,偏移地址被称为有效地址EAEffective Address)。有效地址用中括号括起来。

    4. 有多种获得偏移地址的方法,所以存储器寻址方式又分成多种寻址方式。

         ⑴ 有效地址直接给出,存在于指令代码中,就是直接寻址方式。

         ⑵ 有效地址存在寄存器中,就是通过寄存器的间接寻址方式。

         ⑶ 有效地址是两部分的和,一部分在寄存器中,另一部分直接给出(称为位移量),这就是寄存器相对寻址方式。

         ⑷ 有效地址是两部分的和,一部分在基址寄存器中(8086BXBP),另一部分在变址寄存器中(8086SIDI),这就是基址变址寻址方式。

         ⑸ 有效地址是三部分的和,第一部分在基址寄存器中(8086BXBP),第二部分在变址寄存器中(8086SIDI),第三部分直接给出(称为位移量),这就是相对基址变址寻址方式。

    5. 区别各种寻址方式时,注意各自的特点。

            只有一个常量,是立即(数)寻址方式;

            只有一个寄存器名,是寄存器寻址方式;

            其他则是存储器寻址方式。

            用中括号括起一个常量是直接寻址方式;

            用中括号括起一个寄存器名,是寄存器间接寻址方式;

            用中括号括起一个寄存器名和一个常量是寄存器相对寻址方式;

            用中括号括起两个寄存器名是基址变址寻址方式;

            用中括号括起两个寄存器名和一个常量是相对基址变址寻址方式。

    6. 汇编语句中,还有其他形式出现,需要理解相应操作符才能做出正确判断。

    例如,

            直接写出变量名实际上是直接寻址方式;

            变量名加减一个常量还是直接寻址方式;

            变量名和一个寄存器则是寄存器相对寻址方式;

            利用offset后跟一个变量名则是立即数寻址方式。

     

    8086 CPU的七种基本的寻址方式:

        分别是:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址

    1. 立即寻址:操作数包含在指令中,是指令的一部分。此时的操作数称为立即数

        MOV EAX, 1234H

    2. 寄存器寻址:操作数在CPU寄存器中,指令中指定寄存器编号

        MOV SI, AX

        MOV AL, AH

    3. 直接寻址:操作数在存储器中,指令直接包含操作数的有效地址。此时操作数一般存放在数据段DS中,采用换段前缀可以使用其它段寄存器。

        MOV AX, [1234H]

    4. 寄存器间接寻址:操作数在存储器中,操作数有效地址在ESIEDIEBXEBP之一种。在不使用换段前缀的情   况下,若有效地址在SI/DI/BX中,则以DS的值为段值;若有效地址在BP中,则以段寄存器SS的值为段值。

        MOV AX, [SI]

        MOV [BP], CX

    5. 寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BXBP)或变址寄存器(SIDI)内容加上指令中给定的8位或16位位移量之和。即:

         EA = (BX/BP/SI/DI) + (8/16位位移量)

         在不使用换段前缀的情况下,若SI/DI/BX的内容作为有效地址的一部分,则以DS的值为段值;若BP的内容作为有效地址的一部分,则以段寄存器SS的值为段值。

        在指令中给定的8位或16位位移量以补码形式表示。在计算有效地址时,若位移量是8位,则将其有符号扩展为16位,当有效地址超过FFFFH,则对其进行64K取模。

        例如:MOV AX, [DI+1223H]

           MOV BX, [BP-4]

           MOV ES:[BX+5], AL

        注意:书写时基址或变址寄存器名一定要放在方括号中,而位移可以不写在方括号中。

    下面两条指令是等价的:

           MOV AX, [SI+3] 等价于 MOV AX, 3[SI]

    6. 基址加变址寻址:操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容相加得到。

         EA = (BX/BP) + (SI/DI)

        在不使用换段前缀的情况下,若BP的内容作为有效地址的一部分,则以SS的值为段值;否则以DS的值为段值。有效地址超过FFFFH,则对其进行64K取模。例如:

         MOV AX, [BX+DI]     等价形式     MOV AX, [DI][BX]

         MOV AX, ES:[BX+SI]

         MOV DS:[BP+SI], AL

    7. 相对基址加变址寻址:操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容以及指令中给定的8位或16位位移量相加得到。

         EA = (BX/BP) + (SI/DI) + (8/16位位移量)

        在不使用换段前缀的情况下,若BP的内容作为有效地址的一部分,则以SS的值为段值;否则以DS的值为段值。有效地址超过FFFFH,则对其进行64K取模。例如:

         MOV AX, [BX+DI+1234H]

         MOV AX, 1234H[BX+DI]

         MOV AX, 1234H[BX][DI]

         MOV AX, 1234H[DI][BX]

     


    最新回复(0)