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前綴配合使用。
以上是一些常見的指令,沒有包含程序轉移指令,程序轉移指令會單獨放在一篇裏面說明。