「編程」x86常用匯編指令詳解

軟件破解常用匯編指令


cmp a,b // 比較a與b

mov a,b // 把b值送給a值,使a=b

ret // 返回主程序

nop // 無作用

call // 調用子程序,子程序以ret結尾

je或jz // 相等則跳(機器碼是74或84)

jne或jnz // 不相等則跳(機器碼是75或85)

jmp // 無條件跳(機器碼是EB)

jb // 若小於則跳

ja // 若大於則跳

jg // 若大於則跳

jge // 若大於等於則跳

jl // 若小於則跳

pop xxx // xxx出棧

push xxx // xxx壓棧

★★破解經典句式★★

1.(最常用)

mov eax [ ]

mov edx [ ]

call 00?????? 關鍵call

test eax eax

jz(jnz)或 jne(je) 關鍵跳轉

2 (最常用)

mov eax [ ]

mov edx [ ]

call 00?????? 關鍵call

jne(je) 關鍵跳轉

3

mov eax [ ]

mov edx [ ]

cmp eax,edx

jnz(jz)

4

lea edi [ ]

lea esi [ ]

repz cmpsd

jz(jnz)

5

mov eax [ ]

mov edx [ ]

call 00??????

setz (setnz) al (bl,cl…)

6

mov eax [ ]

mov edx [ ]

call 00??????

test eax eax

setz (setnz) bl,cl…

7

call 00?????? ***

push eax (ebx,ecx…)

……

……

call 00??????

pop eax (ebx,ecx…)

test eax eax

jz(jnz)

一、數據傳輸指令

───────────────────────────────────────

它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據.

1. 通用數據傳送指令.

MOV 傳送字或字節.

MOVSX 先符號擴展,再傳送.

MOVZX 先零擴展,再傳送.

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依次彈出堆棧.

BSWAP 交換32位寄存器裡字節的順序

XCHG 交換字或字節.( 至少有一個操作數為寄存器,段寄存器不可作為操作數)

CMPXCHG 比較並交換操作數.( 第二個操作數必須為累加器AL/AX/EAX )

XADD 先交換再累加.( 結果在第一個操作數里 )

XLAT 字節查錶轉換.

── BX 指向一張 256 字節的表的起點, AL 為表的索引值 (0-255,即

0-FFH); 返回 AL 為查表結果. ( [BX+AL]->AL )

2. 輸入輸出端口傳送指令.

IN I/O端口輸入. ( 語法: IN 累加器, {端口號│DX} )

OUT I/O端口輸出. ( 語法: OUT {端口號│DX},累加器 )

輸入輸出端口由立即方式指定時, 其範圍是 0-255; 由寄存器 DX 指定時,

其範圍是 0-65535.

3. 目的地址傳送指令.

LEA 裝入有效地址.

例: LEA DX,string ;把偏移地址存到DX.

LDS 傳送目標指針,把指針內容裝入DS.

例: LDS SI,string ;把段地址:偏移地址存到DS:SI.

LES 傳送目標指針,把指針內容裝入ES.

例: LES DI,string ;把段地址:偏移地址存到ES:DI.

LFS 傳送目標指針,把指針內容裝入FS.

例: LFS DI,string ;把段地址:偏移地址存到FS:DI.

LGS 傳送目標指針,把指針內容裝入GS.

例: LGS DI,string ;把段地址:偏移地址存到GS:DI.

LSS 傳送目標指針,把指針內容裝入SS.

例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

4. 標誌傳送指令.

LAHF 標誌寄存器傳送,把標誌裝入AH.

SAHF 標誌寄存器傳送,把AH內容裝入標誌寄存器.

PUSHF 標誌入棧.

POPF 標誌出棧.

PUSHD 32位標誌入棧.

POPD 32位標誌出棧.


二、算術運算指令

───────────────────────────────────────

  ADD 加法.

ADC 帶進位加法.

INC 加 1.

AAA 加法的ASCII碼調整.

DAA 加法的十進制調整.

SUB 減法.

SBB 帶借位減法.

DEC 減 1.

NEC 求反(以 0 減之).

CMP 比較.(兩操作數作減法,僅修改標誌位,不回送結果).

AAS 減法的ASCII碼調整.

DAS 減法的十進制調整.

MUL 無符號乘法.

IMUL 整數乘法.

以上兩條,結果回送AH和AL(字節運算),或DX和AX(字運算),

AAM 乘法的ASCII碼調整.

DIV 無符號除法.

IDIV 整數除法.

以上兩條,結果回送:

商回送AL,餘數回送AH, (字節運算);

或 商回送AX,餘數回送DX, (字運算).

AAD 除法的ASCII碼調整.

CBW 字節轉換為字. (把AL中字節的符號擴展到AH中去)

CWD 字轉換為雙字. (把AX中的字的符號擴展到DX中去)

CWDE 字轉換為雙字. (把AX中的字符號擴展到EAX中去)

CDQ 雙字擴展. (把EAX中的字的符號擴展到EDX中去)


三、邏輯運算指令

───────────────────────────────────────

  AND 與運算.

OR 或運算.

XOR 異或運算.

NOT 取反.

TEST 測試.(兩操作數作與運算,僅修改標誌位,不回送結果).

SHL 邏輯左移.

SAL 算術左移.(=SHL)

SHR 邏輯右移.

SAR 算術右移.(=SHR)

ROL 循環左移.

ROR 循環右移.

RCL 通過進位的循環左移.

RCR 通過進位的循環右移.

以上八種移位指令,其移位次數可達255次.

移位一次時, 可直接用操作碼. 如 SHL AX,1.

移位>1次時, 則由寄存器CL給出移位次數.

如 MOV CL,04

SHL AX,CL


四、串指令

───────────────────────────────────────

 DS:SI 源串段寄存器 :源串變址.

ES:DI 目標串段寄存器:目標串變址.

CX 重複次數計數器.

AL/AX 掃描值.

D標誌 0表示重複操作中SI和DI應自動增量; 1表示應自動減量.

Z標誌 用來控制掃描或比較操作的結束.

MOVS 串傳送.

( MOVSB 傳送字符. MOVSW 傳送字. MOVSD 傳送雙字. )

CMPS 串比較.

( CMPSB 比較字符. CMPSW 比較字. )

SCAS 串掃描.

把AL或AX的內容與目標串作比較,比較結果反映在標誌位.

LODS 裝入串.

把源串中的元素(字或字節)逐一裝入AL或AX中.

( LODSB 傳送字符. LODSW 傳送字. LODSD 傳送雙字. )

STOS 保存串.

是LODS的逆過程.

REP 當CX/ECX<>0時重複.

REPE/REPZ 當ZF=1或比較結果相等,且CX/ECX<>0時重複.

REPNE/REPNZ 當ZF=0或比較結果不相等,且CX/ECX<>0時重複.

REPC 當CF=1且CX/ECX<>0時重複.

REPNC 當CF=0且CX/ECX<>0時重複.


五、程序轉移指令

───────────────────────────────────────

 1>無條件轉移指令 (長轉移)

JMP 無條件轉移指令

CALL 過程調用

RET/RETF過程返回.

2>條件轉移指令 (短轉移,-128到+127的距離內)

( 當且僅當(SF XOR OF)=1時,OP1

JA/JNBE 不小於或不等於時轉移.

JAE/JNB 大於或等於轉移.

JB/JNAE 小於轉移.

JBE/JNA 小於或等於轉移.

以上四條,測試無符號整數運算的結果(標誌C和Z).

JG/JNLE 大於轉移.

JGE/JNL 大於或等於轉移.

JL/JNGE 小於轉移.

JLE/JNG 小於或等於轉移.

以上四條,測試帶符號整數運算的結果(標誌S,O和Z).

JE/JZ 等於轉移.

JNE/JNZ 不等於時轉移.

JC 有進位時轉移.

JNC 無進位時轉移.

JNO 不溢出時轉移.

JNP/JPO 奇偶性為奇數時轉移.

JNS 符號位為 "0" 時轉移.

JO 溢出轉移.

JP/JPE 奇偶性為偶數時轉移.

JS 符號位為 "1" 時轉移.

3>循環控制指令(短轉移)

LOOP CX不為零時循環.

LOOPE/LOOPZ CX不為零且標誌Z=1時循環.

LOOPNE/LOOPNZ CX不為零且標誌Z=0時循環.

JCXZ CX為零時轉移.

JECXZ ECX為零時轉移.

4>中斷指令

INT 中斷指令

INTO 溢出中斷

IRET 中斷返回

5>處理器控制指令

HLT 處理器暫停, 直到出現中斷或復位信號才繼續.

WAIT 當芯片引線TEST為高電平時使CPU進入等待狀態.

ESC 轉換到外處理器.

LOCK 封鎖總線.

NOP 空操作.

STC 置進位標誌位.

CLC 清進位標誌位.

CMC 進位標誌取反.

STD 置方向標誌位.

CLD 清方向標誌位.

STI 置中斷允許位.

CLI 清中斷允許位.


六、偽指令

───────────────────────────────────────

  DW 定義字(2字節).

PROC 定義過程.

ENDP 過程結束.

SEGMENT 定義段.

ASSUME 建立段寄存器尋址.

ENDS 段結束.

END 程序結束.




"