保护模式、实地址模式及V8086模式下的指令格式(下)

保护模式、实地址模式及V8086模式下的指令格式(下)

本文转自:http://blog.csdn.net/misterliwei/article/details/5550467

学习汇编语言时,我们都是从寻址方式开始的。所谓寻址方式就是指令中操作数是如何指定的。在16位时,寻址方式有:
1.立即数寻址
操作数直接存放在指令中,紧跟在操作码之后。

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

3.存储器寻址,存储器寻址方式是说操作数存放在内存之中,指定这些内存的有效地址(effective address)有下面这几种方法。
3.1 直接寻址
直接寻址时,操作数的有效地址紧跟操作码之后。比如:MOV AX, [0X1000]

3.2 寄存器间接寻址
操作数的有效地址存放在基址寄存器BX和BP、或者变址寄存器SI和DI中。
   EA = 16 * DS + SI
或EA = 16 * DS + DI
或EA = 16 * DS + BX
或EA= 16 * SS + BP    (注意:BP的缺省段寄存器为SS,其他都为DS)

3.3 寄存器相对寻址
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16为偏移量的和。注意这个偏移量是带符号的,即可正可负。
    EA =  16 * DS + SI + DISP8/16
或 EA =  16 * DS + DI + DISP8/16
或 EA =  16 * DS + BX + DISP8/16
或 EA =  16 * SS + BP + DISP8/16


3.4 基址变址寻址
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。
    EA =  16 * DS + BX + SI或 DI
或 EA =  16 * SS + BP + SI或 DI

3.5 相对基址变址寻址
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位偏移量之和。同上面一样,这个偏移量是带符号的,即可正可负。
    EA =  16 * DS + BX + SI(或 DI) + DISP8/16
或 EA =  16 * SS + BP + SI(或 DI) + DISP8/16

 

 

上面的这些寻址方式,我将它在表2-1中表示了出来,见表2-1a。当初学习寻址方式时总是一头雾水,现在将它和I32的指令码格式联系在一起总算明白了。:)

 

保护模式、实地址模式及V8086模式下的指令格式(下)_第1张图片

 

上图中我们还发现一个问题:寄存器间接寻址中可以使用SI、DI、BX、BP这四个寄存器。但是我们看到Mod=00时只能表示SI、DI、BX三个寄存器,那么BP是如何表示的呢?原来它是通过在MOD=01和10时,设置disp8和disp16偏移值来实现的。所以在编译下面两条指令时可能差别很大的。
    指令              编码
Mov ax, [bx]    8B 07
Mov ax, [bp]    8B 46 00

32位寻址方式和16位上述的寻址方式基本一致见表2-2a。

 

保护模式、实地址模式及V8086模式下的指令格式(下)_第2张图片

 

和16位寻址方式的几个区别:
a.32位的寄存器间接寻址可以使用除ESP外的所有通用寄存器,而不是16位时的四个寄存器(SI、DI、BX、BP)。
b.32位的寄存器相对寻址、基址变址寻址、相对基址变址寻址都可以使用除ESP外的所有的通用寄存器。
c.由于32位寻址方式添加了一位SIB字节(见表2-3),所以在基址变址寻址和相对基址变址方式时,可以使用一个新的特性:比例。一共有1、2、4、8四种比例方式。

参考文献:
1.《IBM-PC汇编语言程序设计》,沈美明,温冬蝉编著,清华大学出版社

你可能感兴趣的:(汇编)