4.2.4 8086寻址方式

4.2.4 8086寻址方式

在4.2.2节中提到,对于一条指令而言,操作数可能存放在不同的地方,或许在寄存器中,或许在内存中,那么指令要通过某种方法表示操作数是哪一种,操作数具体在哪里,指令中提供操作数或操作数地址的方法就称为寻址方式。

1.立即数寻址

立即数寻址方式是指操作数直接存放在指令中,紧跟在操作码之后,操作对象就是这个操作数,通常用于给寄存器赋值。汇编指令所涉及的立即数有:各种进制常数、字符常数、符号常量、地址(段名、段地址、偏移地址)以及常数表达式等。例如,movw$0x1234,%ax;将十六进制数1234 H 送入AX,指令指行后,(AX)=1234H,这里(AX)表示寄存器AX 中的内容,下同,如图4.7所示。

图4.7 立即数寻址

以下例子中第一操作数为立即数寻址方式,MOV 指令的功能是将第一操作数送给第二操作数。

立即数只能作为源操作数,不能作为目的操作数,它的类型可以是字节,也可以是字,由指令本身决定。如上例中第一条指令“movb $5,%al”中的5为字节,第二条指令中“movw$5,%ax”中的5则为字。在进行数据传送或运算时,要注意指令的两个操作对象的位数应当保持一致。

2.寄存器寻址

指令中出现的寄存器名作为操作数的寻址方式称为寄存器寻址方式,操作对象实质上是寄存器中的内容,用以存放操作数、操作数的地址或中间结果。而且对寄存器存取数据比对存储器存取数据快得多,所以这种寻址方式可以缩短指令长度,节省存储空间,提高指令的执行速度,因而在计算机中得到广泛应用。

例如:movw%bx,%ax,如图4.8所示。

图4.8 寄存器寻址

若指令执行前(AX)=3024H,(BX)=3324H;则指令执行后(AX)=3324H,(BX)=3324H。

以下例子中第一操作数和第二操作数均为寄存器寻址方式:

注意:源寄存器和目的寄存器的位数必须一致。

3.存储器寻址

如果操作码所需操作数存放在存储单元中,则指令中需给出操作数的存储单元地址信息。指令中给出操作数所在存储单元的有效地址,这种寻址方式称为直接寻址,默认的段为数据段。

例如:movb4(,1),%al

图4.9 直接寻址

该指令的功能是将数据段位移为4的那个存储单元存放的一个字节送至AL寄存器。

例如:假设(DS)=3000H,而直接位移量为2100H,AX内容为3047H。

执行指令:movw%ax,0x2100(,1)

直接寻址的过程如图4.9所示。

指令中操作对象实质上是将寄存器AX 中的内容送到存储器单元中,存储器单元的地址是由段地址及段内偏移地址确定的,段地址的确定实质上是确定哪个段寄存器,段寄存器除非在指令中特别指定,其他情况下均为默认,直接寻址方式隐含使用的段寄存器如表4.4所示。8086允许段超越,在这种情况下汇编指令中需在有效地址前根据需要写上表4.4所示中允许选择的段寄存器的名字,然后用冒号分隔,此时则在形成物理地址时将使用相应的段寄存器作为段基址以代替隐含的段寄存器。

表4.4 内存地址对应的SR 及EA

例如:movw es:5(,1),%ax

这里的“ES:”称段前缀操作,“es:5(,1)”中如果没有ES段前缀指定,是相对DS的寻址,而这里用“ES:”作为段前缀指定,于是就改成了相对ES寻址。所以存储器单元的物理地址计算变为

物理地址=(ES)×10H+5

4.寄存器间接寻址

寄存器间接寻址方式是指在指令中给出寄存器名,寄存器中的内容为操作数的有效地址。如果指令中指定的寄存器是BX、SI和DI,在没有加段超越前缀的情况下,操作数必定在数据段,以DS段寄存器中的内容作为段地址,操作数的物理地址为

物理地址=(DS)×10 H+(BX)或(SI)或(DI)

如果指令中指定的寄存器是BP,在没有加段超越前缀的情况下,则操作数必定在堆栈中,以SS段寄存器中的内容作为段地址,操作数的物理地址为

物理地址=(SS)×10 H+(BP)

若在指令中加上段超越前缀,则以指定的段寄存器中的内容作为段地址。寄存器间接寻址的地址形成如表4.5所示。

表4.5 寄存器间接寻址的地址形成

例如:movw(%bp),%ax

表示SS内容乘以10 H,加上BP的内容构成了物理地址,取该地址的内容送入AX 寄存器。

例如:mov(%bx),%ax

图4.10 寄存器间接寻址

若(DS)=2000 H,(BX)=1000H,物理地址=20000H+1000H=21000H。

在指令执行前,假设(AX)=2030H,(21000H)=0A0H,(21001H)=50H,则指令执行后,(AX)=50A0H。指令执行示意如图4.10所示。

5.寄存器相对寻址方式

这种寻址方式通过基址寄存器BX、BP 或变址寄存器SI、DI与一个8位或16位偏移量相加形成有效地址,其物理地址的计算方法如下:

物理地址=(DS)×10H+(SI)+8位或16位偏移量

或 物理地址=(DS)×10 H+(DI)+8位或16位偏移量

或 物理地址=(DS)×10H+(BX)+8位或16位偏移量

或 物理地址=(SS)×10H+(BP)+8位或16位偏移量

例如:movw disp(%si),%bx ;disp为16位偏移量

假设(DS)=1000H,(SI)=3000H,disp=4000H,(17000H)=1234H,则源操作数的物理地址=(DS)×10H+(SI)+disp=10000H+3000H+4000H=17000H。指令执行后,(BX)=1234 H,即将物理地址为17000 H 字单元中的内容送入BX 寄存器。