彙編基礎學習筆記

鬱濤丶發表於2020-10-11
菜鳥最近才剛剛開始學習逆向,做了一些彙編的筆記,如下:

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′○)

相關文章