天天看點

保護模式、實位址模式及V8086模式下的指令格式(下)

保護模式、實位址模式及V8086模式下的指令格式(下)

學習彙編語言時,我們都是從尋址方式開始的。所謂尋址方式就是指令中操作數是如何指定的。在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的指令碼格式聯系在一起總算明白了。:)

上圖中我們還發現一個問題:寄存器間接尋址中可以使用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。

和16位尋址方式的幾個差別:

a.32位的寄存器間接尋址可以使用除ESP外的所有通用寄存器,而不是16位時的四個寄存器(SI、DI、BX、BP)。

b.32位的寄存器相對尋址、基址變址尋址、相對基址變址尋址都可以使用除ESP外的所有的通用寄存器。

c.由于32位尋址方式添加了一位SIB位元組(見表2-3),是以在基址變址尋址和相對基址變址方式時,可以使用一個新的特性:比例。一共有1、2、4、8四種比例方式。

參考文獻:

1.《IBM-PC彙編語言程式設計》,沈美明,溫冬蟬編著,清華大學出版社

繼續閱讀