(1)操作數(shù)包含在指令中。在取指令的同時,操作數(shù)也隨著取出,這種操作數(shù)被稱為立即數(shù)。
。2)操作數(shù)包含在CPU的某個內(nèi)部寄存器中。由于該寄存器在CPU內(nèi)部,因此取操作數(shù)也較簡單。
。3)操作數(shù)在內(nèi)存儲器中。由于內(nèi)存儲器在CPU的外部,因此在尋找此種操作數(shù)時需要執(zhí)行一個總線周期,首先找到該操作數(shù)在內(nèi)存中存放的地址,再從該地 址中取出操作數(shù)。在80x86微機系統(tǒng)中,任何內(nèi)存單元的地址由段基址和偏移地址(又稱偏移量)組成,段基址由段寄存器提供,而偏移地址則由以下四個基本 部分組合而成:
基址寄存器;
間址寄存器(或稱變址寄存器);
比例因子;
位移量。
這四個部分被稱為偏移地址四元素。一般將這四種元素按某種計算方法組合形成的偏移地址稱為有效地址EA(Effective Address)。它們的組合方式和計算方法為:
EA基址+(間址×比例因子)+位移量
采用16位尋址時,位移量是8位或16位,用BX和BP作基址寄存器,SI和DI作間址寄存器,比例因子為1。
采用32位尋址時,可使用8位和32位的位移量,32位的通用寄存器都可以作基址寄存器或間址寄存器(ESP不用于間址),并且可采用2、4或8幾種不同的比例因子。
這四種元素可優(yōu)化組合出9種存儲器尋址方式,加上立即數(shù)尋址和寄存器尋址,共有11種尋址方式,下面詳細討論。為了說明數(shù)據(jù)的尋址方式,以匯編語言中的MOV指令為例。指令的格式為:MOV目標操作數(shù),源操作數(shù);其功能是將源操作數(shù)傳送到目標操作數(shù)。
1.立即數(shù)尋址(Immediate Addressing)
指令中所需操作數(shù)存放在指令中,放在操作碼(OP)后。操作數(shù)可以是8位、16位或32位。由于在指令執(zhí)行過程中,立即數(shù)作為指令的一部分直接從指令預(yù)取單元中取出,不需要再訪問存儲器,因此這種尋址方式執(zhí)行速度快。
例如,在MOV AX,1020H指令中,1020H為立即數(shù),該指令的功能是將立即數(shù)1020H傳送到AX中,執(zhí)行示意圖見。
立即數(shù)尋址時,只允許源操作數(shù)為立即數(shù),目標操作數(shù)必須是寄存器或存儲器,其作用是給寄存器或存儲單元賦值。
2.寄存器尋址(Register Addressing)
指令中所需操作數(shù)在CPU的某個寄存器中,由于存取此類操作數(shù)在CPU內(nèi)部進行,所以執(zhí)行速度快。
例如:MOV AL, BL
執(zhí)行情況見。
3.直接尋址(Direct Addressing)
操作數(shù)一般存放在存儲器的數(shù)據(jù)段中,而操作數(shù)的有效地址EA(16位或32位)由指令給出。在直接尋址中,為取得操作數(shù)必須先求出存放操作數(shù)的存儲單元的物理地址。如果操作數(shù)在數(shù)據(jù)段中,則求得:物理地址(DS)×16+EA,其操作過程。
例如:MOV AX, DS:[2000H]
設(shè)(DS)3000H,物理地址(3000H)×16+2000H32000H,即將存儲器32000H和32001H兩個單元的內(nèi)容送到AX寄存器。注意,低地址的存儲單元32000H的內(nèi)容送到AX的低字節(jié)AL中。
直接尋址允許用符號地址來代替數(shù)值地址,例如:MOV AX,[DATA],此時變量DATA為存放操作數(shù)的存儲單元的符號地址。上述指令還可寫為:MOV AX, DATA,兩者是等效的。直接尋址適用于處理單個變量。
4.寄存器間接尋址(Register Indirect Addressing)
操作數(shù)在存儲器中,操作數(shù)的有效地址EA存放在某個寄存器(Reg)中,其尋址方式。寄存器的使用在16位尋址和32位尋址時不一樣。
1)16位尋址
偏移地址放在SI、DI、BX、BP中。
如果指令中指定的寄存器是BX、SI、DI,則操作數(shù)在數(shù)據(jù)段中,操作數(shù)的物理地址為:
物理地址(DS)×16+(BX)
……(SI)
……(DI)
如果指令中指定的寄存器是BP,則操作數(shù)在堆棧段中,段基址在SS中,操作數(shù)的物理地址為:
物理地址(SS)×16+(BP)
2)32位尋址
8個32位通用寄存器均可作寄存器間接尋址用。除ESP和EBP默認段寄存器為SS外,其余6個通用寄存器均默認段寄存器為DS。