寄存器和尋址方式
寄存器,在8086/8088裏,有三組共13個16位寄存器.
寄存器,從名字上看,可以知道,它就象書店的行包寄存處,寄存器的名字就象寄存處發給用戶取回自已物件的標誌牌子,表示物件的存放地址.
寄存器的內部給構都相同,只不過是一個二字節或一字節的存儲空間,別看他們小,作用可大了,所有電腦的運算,都要從他們過關,因爲他們的處理速度快嘛.爲了區分和準確運用,就要給他們進行科學的分組和起名.
第一組,數據寄存器,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都可以表示變址,在串操作中,SI和DI表示源和目的操作數的指示器,快速記憶方法:SI聯想飲水思源的思(諧音SI),DI聯想目的(諧音DI).
BP,SP的P表示堆棧專用,BP表示基地址專用,SP則是堆棧頂指示器.其中,BP,SI,DI還可以兼作數據寄存器.SP則只能和堆棧綁定.
第三組,段寄存器,CS,SS,DS,ES.
它們用來存放CPU可以直接訪問的四個當前段的段首地址.CS代碼段,SS堆棧段,DS數據段,ES附加段.其中,在表示地址時,CS和指令指示器IP綁定使用,SS和BP綁定.DS爲SI,DI,BX共用.
第四組,指令指示器,IP,這是CPU自動引用的,表示下一次要從主存取出的指令的偏移.
尋址方式
尋址方式分爲六種,(這是教材裏講的).
1,立即尋址, 數據的本身在代碼段.用於賦初值.
2,直接尋址, 數據的偏移在代碼段,用於變量名.
3,寄存器尋址, 數據的本身在寄存器.用寄存器名錶示.
4,寄存器間接尋址, 數據所在存儲單元的地址在某個寄存器中.
5,寄存器相對尋址, 數據的偏移在寄存器.注意:BP和SS綁定.DS爲SI,DI,BX共用.
6,變址尋址, 數據的偏移在一個寄存器裏,並要加上一個偏移量.注意:BP和SS綁定.DS爲SI,DI,BX共用.
7,間接尋址, 指令中給出數據的地址的地址.
8,基址加變址尋址, 數據的偏移放在兩個寄存器中,並要加上一個偏移量.注意:BP和SS綁定.DS爲SI,DI,BX共用.BX爲DS段的基址專用.
尋址方式是彙編語言的重點和難點。請按如下思路學習:
1. 操作數可以存在什麼地方?
⑴ 操作數存在於指令代碼中,處理器譯碼時就立即獲得了這個操作數,這就是立即(數)尋址方式。彙編指 令中,這個立即數(操作數)以常量形式出現。MOV EAX,94H
⑵ 操作數存在於處理器內部寄存器中,處理器從寄存器中獲得這個操作數,這就是寄存器尋址方式。彙編指 令中,這個寄存器操作數以寄存器名形式出現。MOV EAX,EBX
⑶ 操作數存在於主存中,處理器從主存單元獲得這個操作數,這就是存儲器尋址方式。彙編指令中,這個存 儲器操作數以主存地址形式出現。
2. 8086/8088處理器的主存地址在程序設計時採用邏輯地址。邏輯地址分成段地址和偏移地址兩部分。
3. 存儲器尋址方式表達存儲器地址時,段地址在默認的或段超越前綴指令指定的段寄存器中,偏移地址被稱爲有效地址EA(Effective Address)。有效地址用中括號括起來。
4. 有多種獲得偏移地址的方法,所以存儲器尋址方式又分成多種尋址方式。
⑴ 有效地址直接給出,存在於指令代碼中,就是直接尋址方式。
⑵ 有效地址存在寄存器中,就是通過寄存器的間接尋址方式。
⑶ 有效地址是兩部分的和,一部分在寄存器中,另一部分直接給出(稱爲位移量),這就是寄存器相對尋址方式。
⑷ 有效地址是兩部分的和,一部分在基址寄存器中(8086是BX和BP),另一部分在變址寄存器中(8086是SI和DI),這就是基址變址尋址方式。
⑸ 有效地址是三部分的和,第一部分在基址寄存器中(8086是BX和BP),第二部分在變址寄存器中(8086是SI和DI),第三部分直接給出(稱爲位移量),這就是相對基址變址尋址方式。
5. 區別各種尋址方式時,注意各自的特點。
只有一個常量,是立即(數)尋址方式;
只有一個寄存器名,是寄存器尋址方式;
其他則是存儲器尋址方式。
用中括號括起一個常量是直接尋址方式;
用中括號括起一個寄存器名,是寄存器間接尋址方式;
用中括號括起一個寄存器名和一個常量是寄存器相對尋址方式;
用中括號括起兩個寄存器名是基址變址尋址方式;
用中括號括起兩個寄存器名和一個常量是相對基址變址尋址方式。
6. 彙編語句中,還有其他形式出現,需要理解相應操作符才能做出正確判斷。
例如,
直接寫出變量名實際上是直接尋址方式;
變量名加減一個常量還是直接尋址方式;
變量名和一個寄存器則是寄存器相對尋址方式;
利用offset後跟一個變量名則是立即數尋址方式。
8086 CPU的七種基本的尋址方式:
分別是:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、寄存器相對尋址、基址加變址尋址、相對基址加變址尋址
1. 立即尋址:操作數包含在指令中,是指令的一部分。此時的操作數稱爲立即數
MOV EAX, 1234H
2. 寄存器尋址:操作數在CPU寄存器中,指令中指定寄存器編號
MOV SI, AX
MOV AL, AH
3. 直接尋址:操作數在存儲器中,指令直接包含操作數的有效地址。此時操作數一般存放在數據段DS中,採用換段前綴可以使用其它段寄存器。
MOV AX, [1234H]
4. 寄存器間接尋址:操作數在存儲器中,操作數有效地址在ESI、EDI、EBX、EBP之一種。在不使用換段前綴的情 況下,若有效地址在SI/DI/BX中,則以DS的值爲段值;若有效地址在BP中,則以段寄存器SS的值爲段值。
MOV AX, [SI]
MOV [BP], CX
5. 寄存器相對尋址:操作數在存儲器中,操作數的有效地址是一個基址寄存器(BX、BP)或變址寄存器(SI、DI)內容加上指令中給定的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]