菜鳥最近才剛剛開始學習逆向,做了一些彙編的筆記,如下:
1 . 32位通用暫存器
- 資料暫存器EAX, EBX, ECX, EDX.
EAX:累加暫存器,是很多加法乘法指令的預設暫存器
EBX:基址暫存器,在記憶體定址時存放基地址
ECX:計數暫存器,是重複(REP)字首指令和LOOP指令的內定計數器
EDX:資料暫存器,總是被用來放整數除法產生的餘數.
- 段暫存器
CS:程式碼段暫存器 ES:附加段暫存器
DS:資料段暫存器 FS:附加段暫存器
SS:堆疊段暫存器 GS:附加段暫存器
- 索引暫存器ESI, EDI
ESI:源索引暫存器
EDI:目的索引暫存器
在很多字串操作指令中,DS:ESI指向源串,而ES:EDI指向目標串
- 指令指標暫存器
EIP:指令指標暫存器,儲存的是CPU下次要執行的指令的地址.
- 指標暫存器
EBP為基指標暫存器,用它可直接存取堆疊中的資料。
ESP為堆疊指標暫存器,用它只可訪問棧頂。
- 標誌暫存器
進位標誌CF(Carry Flag):
進位標誌CF主要用來反映運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那麼,其值為1,否則其值為0。
奇偶標誌PF(Parity Flag):
奇偶標誌PF用於反映運算結果中“1”的個數(二進位制)的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。
輔助進位標誌AF(Auxiliary Carry Flag)
在發生下列情況時,輔助進位標誌AF的值被置為1,否則其值為0:
(1)、在字操作時,發生低位元組向高位元組進位或借位時;
(2)、在位元組操作時,發生低4位向高4位進位或借位時。
零標誌ZF(Zero Flag)
零標誌ZF用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標誌位。
符號標誌SF(Sign Flag)
符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數採用補碼錶示法,所以,SF也就反映運算結果的正負號。運算結果為正數時,SF的值為0,否則其值為1。
溢位標誌OF(Overflow Flag)
溢位標誌OF用於反映有符號數加減運算所得結果是否溢位。如果運算結果超過當前運算位數所能表示的範圍,則稱為溢位,OF的值被置為1,否則,OF的值被清為0。
追蹤標誌TF(Trap Flag)
當追蹤標誌TF被置為1時,CPU進入單步執行方式,即每執行一條指令,產生一個單步中斷請求。這種方式主要用於程式的除錯。
指令系統中沒有專門的指令來改變標誌位TF的值,但程式設計師可用其它辦法來改變其值。
中斷允許標誌IF(Interrupt-enable Flag)
中斷允許標誌IF是用來決定CPU是否響應CPU外部的可遮蔽中斷髮出的中斷請求。但不管該標誌為何值,CPU都必須響應CPU外部的不可遮蔽中斷所發出的中斷請求,以及CPU內部產生的中斷請求。具體規定如下:
(1)、當IF=1時,CPU可以響應CPU外部的可遮蔽中斷髮出的中斷請求;
(2)、當IF=0時,CPU不響應CPU外部的可遮蔽中斷髮出的中斷請求。
方向標誌DF(Direction Flag)
方向標誌DF用來決定在串操作指令執行時有關指標暫存器發生調整的方向。具體規定在第5.2.11節——字串操作指令——中給出。在微機的指令系統中,還提供了專門的指令來改變標誌位DF的值。
2. 常用的32彙編指令
-
ADD :加法
-
ADC :帶位加法
-
SBB :帶位減法
-
SUB:減法.
-
INC :加法.
-
CMP :比較.(兩運算元作減法,僅修改標誌位,不回送結果).
-
AND :與運算.
-
OR :或運算.
-
XOR :異或運算.
-
NOT :取反.
-
MOV:傳送字或位元組.
-
MOVSX:先符號擴充套件,再傳送.
-
PUSH:把字壓入堆疊.
-
POP:把字彈出堆疊.
-
PUSHA:把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆疊.
-
POPA : 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆疊.
-
PUSHAD : 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆疊.
-
POPAD : 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆疊.
-
LEA : 裝入有效地址. 例: LEA DX,0xAA //把0xAA地址存到DX.
-
JMP :無條件轉移指令
-
CALL:過程呼叫 .
-
RET/RETF : 過程返回.
-
JCC指令:
JCC指令 | 含義 | 英文 | 檢查符號位 | C語句 |
---|---|---|---|---|
JZ/JE | 若為0則跳轉;若相等則跳轉 | jump if zero;jump if equal | ZF=1 | if (i == j);if (i == 0); |
JNZ/JNE | 若不為0則跳轉;若不相等則跳轉 | jump if not zero;jump if not equal | ZF=0 | if (i != j);if (i != 0); |
JS | 若為負則跳轉 | jump if sign | SF=1 | if (i < 0); |
JNS | 若為正則跳轉 | jump if not sign | SF=0 | if (i > 0); |
JP/JPE | 若1出現次數為偶數則跳轉 | jump if Parity (Even) | PF=1 | / |
JNP/JPO | 若1出現次數為奇數則跳轉 | jump if not parity (odd) | PF=0 | / |
JO | 若溢位則跳轉 | jump if overflow | OF=1 | / |
JNO | 若無溢位則跳轉 | jump if not overflow | OF=0 | / |
JC/JB/JNAE | 若進位則跳轉;若低於則跳轉;若不高於等於則跳轉 | jump if carry;jump if below;jump if not above equal | CF=1 | if (i < j); |
JNC/JNB/JAE | 若無進位則跳轉;若不低於則跳轉;若高於等於則跳轉; | jump if not carry;jump if not below;jump if above equal | CF=0 | if (i >= j); |
JBE/JNA | 若低於等於則跳轉;若不高於則跳轉 | jump if below equal;jump if not above | ZF=1或CF=1 | if (i <= j); |
JNBE/JA | 若不低於等於則跳轉;若高於則跳轉 | jump if not below equal;jump if above | ZF=0或CF=0 | if (i > j); |
JL/JNGE | 若小於則跳轉;若不大於等於則跳轉 | jump if less;jump if not greater equal jump | SF != OF | if (si < sj); |
JNL/JGE | 若不小於則跳轉;若大於等於則跳轉; | jump if not less;jump if greater equal | SF = OF | if (si >= sj); |
JLE/JNG | 若小於等於則跳轉;若不大於則跳轉 | jump if less equal;jump if not greater | ZF != OF 或 ZF=1 | if (si <= sj); |
JNLE/JG | 若不小於等於則跳轉;若大於則跳轉 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | if(si>sj) |
目前就學了這麼多
(○` 3′○)