IA32體系結構4(x86常見指令概述)

IA32(x86)體系結構指令種類比較多,但是常見的一般也還行,一下總結linux0.11內核中使用到的所有指令,概述這些指令的基本用法,因指令的使用跟尋址方式都有關係,篇幅所限,不詳細展開所有細節,看內核代碼,瞭解基本情況已經足夠。

1.MOV(mov)

數據轉移指令,從源操作數轉移數據到目標操作數。

2.PUSH(push)

9086~80286中的push總是把兩個字節的數據傳送到堆棧,80386以上處理器可以傳送兩個或四個字節的數據,取決於寄存器或者存儲單元的長度。

3.PUSHA(pusha)

講所有通用寄存器內容壓入堆棧,順序爲:AX、CX、DX、BX、SP、BP、SI、DI。

4.PUSHF(pushf)

將標誌寄存器內容複製到堆棧。

5.POP(pop)

與PUSH想法,從堆棧彈出數據,放入指定的寄存器或者存儲單元。

6.POPA(popa)

從堆棧彈出16字節數據按順序放入以下寄存器:DI、SI、BP、SP、BX、DX、CX、AX。

7.POPF(popf)

從堆棧彈出數據到標誌寄存器。

8.LEA(lea)

LEA指令把由操作數字段指定的數據的偏移地址裝入16位或32位寄存器。比如:

LEA BX,[DI]

將DI指定的偏移地址(DI的內容)裝入BX,不同於MOV BX,[DI],則是將由DI尋址的存儲單元內的數據裝入BX。

9.LDS,LES,LFS,LGS、LSS

把偏移地址裝入任何16位或32位寄存器,並且把段地址裝入DS、ES、FS、GS、SS。比如:

LDS EBX,[DI]

將數據段中由DI尋址的存儲區的4個字節裝入EBX,然後將這4個字節後面的字裝入DS寄存器。

10.CLD(cld)

清除方向標誌D(D=0),串操作期間寄存器DI和SI自增。

11.STD(std)

設置方向標誌D(D=1),串操作期間寄存器DI和SI自減。

串操作指令執行期間,對存儲器的訪問是通過DI和SI兩個寄存器或其中之一實現。DI偏移地址用於訪問附加段ES中的數據,SI偏移地址用於訪問數據段DS中的數據。

12.LODS(lods)

LODS指令將存儲在數據段並用SI寄存器尋址的數據裝入AL、AX或者EAX。裝入AL、AX或者EAX之後,如果D=0,SI寄存器的內容增量,D=1,SI寄存器的內容減量。字節型增減1,字型增減2,雙字型增減4。

LODSB(lodsb)-字節型

LODSW(lodsw)-字型

LODSD(lodsd)-雙字型

13.STOS(stos)

STOS指令將AL、AX或EAX存儲到附加段內由DI寄存器尋址的存儲單元。

STOSB(stosb)-字節型

STOSW(stosw)-字型

STOSD(stosd)-雙字型

REP重複前綴可以加到除了LODS之外的任何串數據傳送指令上。執行重複的LODS操作沒有任何意義。REP前綴使得每次執行串指令後CX減1。CX減1以後,重複執行串指令,直到CX值爲0時,指令終止,繼續執行指令序列的下一條。

14.MOVS(movs)

MOVS將數據從一個存儲單元傳送到另一個存儲單元。這是8086~P4唯一允許的存儲器到存儲器的傳送指令。MOVS指令從數據段DS內由SI尋址的存儲單元把數據傳送到附加段ES內由DI尋址的存儲單元,然後根據方向標誌的指示增量或減量。

MOVSB(movsb)-字節型

MOVSW(movsw)-字型

MOVSD(movsd)-雙字型

15.XCHG(xchg)

交換指令將寄存器的內容與任何其他寄存器或存儲單元的內容交換。該指令不能實現段寄存器之間的交換,或存儲器與存儲器之間的數據交換。比如:

XCHG EDX, ESI

EDX與ESI的內容交換。

16.IN(in)、OUT(out)

在I/O設備與微處理器之間只能傳送AL、AX或者EAX的內容。IN指令將外部I/O設備的數據傳送到AL、AX或EAX,而OUT指令把AL、AX或EAX的數據傳送到外部I/O設備。

17.加法指令

(1)ADD(add)

ADD AL,BL

AL=AL+BL

(2)INC(inc)

使寄存器或者存儲單元內容加1。

(3)ADC(adc)

帶進位加法把進位標誌(C)加到操作數中。

18.減法指令

(1)SUB(sub)

SUB CL, BL

CL=CL-BL

(2)DEC(dec)

減一指令。

(3)SBB(sbb)

帶借位減法指令還要將存於進位標誌(C)中的借位從差中減去。

19.CMP(cmp)

比較指令是隻改變標誌位的減法指令。比如:

CMP EBP,ESI

該指令執行EBP-ESI操作,影響標誌位,結果不存放在寄存器中。

20.乘法指令

(1)IMUL(imul)

有符號乘法指令。

8位乘法指令被乘數放在AL中,積放在AX中。

16位乘法指令被乘數放在AX中,積存放在DX-AX中。DX包含積的最高有效16位,而AX總是包含最低有效16位。

32位乘法指令被乘數放在EAX中,積放在EDX-EAX中。

(2)MUL(mul)

無符號乘法指令。

8位乘法指令被乘數總是在AL中,乘數可以在任何寄存器或者任何存儲單元中。比如:

MUL CL

AL內容乘以CL內容,無符號乘積留在AX中。

21.除法指令

(1)IDIV(有符號除法)

(2)DIV(無符號除法)

8位除法用AX寄存器存放被除數,可除以任何8位寄存器或存儲單元的內容。除法完成後,商放在AL中,用AH保存全部的餘數。比如:

DIV CL

AX內容除以CL內容,AL中存放得到的無符號的商,而餘數在AH中。

16位除法指令DX-AX中的32位數是被除數,商在AX中,餘數在DX中。

32位除法指令使EDX-EAX的64位內容除以指令指定的操作數,32位的商留在EAX中,32位的餘數放在EDX中。

22.邏輯操作

(1)AND(and)

邏輯與操作。

(2)OR(or)

邏輯或操作。

(3)XOR(xor)

邏輯異或操作。

(4)TEST(test)

test指令執行AND操作,區別是AND指令改變目標操作數,而TEST指令不改變目標操作數。TEST隻影響標誌寄存器的狀態,指示測試的結果。

(5)NOT(not)

邏輯取反操作(1的補或NOT)。比如:

NOT CH

對CH求1的補碼。

(6)NEG(neg)

算術符號取反(2的補或NEG)。比如:

NEG CH

對CH求2的補碼。

23.移位指令

(1)SHL(shl)

邏輯左移。

(2)SHR(shr)

邏輯右移。

(3)SAL(sal)

算術左移。

(4)SAR(sar)

算術右移。

(5)ROL(rol)

循環左移。

(6)ROR(ror)

循環右移。

(7)RCL(rcl)

通過進位位循環左移。

(8)RCR(rcr)

通過進位位循環右移。

24.位掃描指令

(1)BSF(bsf)

向前位掃描。從最低位向高位掃描數據,搜索首先遇到的值爲1的位。

(2)BSR(bsr)

向後位掃描。從最高位向最低位掃描數據,搜索首先遇到的值爲1的位。

無論哪條位掃描指令,如果遇到值爲1的位,都將0標誌位置1,並且把該位的位置放入目標操作數。如果沒有遇到值爲1的位,則零標誌位被清0.比如:

BSF EBX,EAX

從最低位向左掃描數字,把EAX中首先遇到的1的位置放入EBX,並且將零標誌置1。

25.串比較指令

(1)SCAS(scas)

串掃描指令可以比較AL、AX和EAX寄存器與存儲區的內容,用AL、AX或EAX中的內容減去存儲單元中的數,但既不改變寄存器的內容,也不改變存儲單元的內容。

SCASB-字節比較

SCASW-字比較

SCASD-雙字比較

所有的情況中,都是附加段中由DI尋址的存儲單元的內容與AL、AX或EAX相比較。像其它串指令一樣,使用方向標誌D選擇對DI是自動加1還是自動減1.比如:

MOV DI,OFFSET BLOCK
CLD
MOV CX,100
XOR AL,AL
REPNE SCASB

以上代碼假設在BLOCK處開始的存儲區域長爲100字節,要求測試這個區域,查看是否哪個單元包含有00H。其中REPNE是不等於則重複前綴。REPNE前綴使得SCASB指令重複到或者CX寄存器達到0,或者按照SCASB指令比較的結果滿足相等條件。

(2)CMPS(cmps)

比較兩個存儲區域的內容。比較是在數據段內由SI尋址的存儲單元的內容和附加段內由DI尋址的存儲單元的內容之間進行。CMPS使SI和DI都自動加1或者減1,它常常與REPE或者REPNE前綴配合使用。

以上是一些常見的指令,沒有包含程序轉移指令,程序轉移指令會單獨放在一篇裏面說明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章