1. 程式人生 > 實用技巧 >常見彙編指令和EFLAGS暫存器對應位的含義

常見彙編指令和EFLAGS暫存器對應位的含義

IDA的彙編採用的Intel語法

彙編指令的後面通常跟一個運算元,運算元可能是常量,記憶體變數或者暫存器。

常量:

mov eax, 0x1234

16進位制1234就是常量。

IA-32中一般之關注8個32位的通用暫存器,分別是EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP

棧指標式ESP暫存器,通常指向棧段的頂端,棧在IA-32上是向下增長的,棧的頂端是棧使用地址中的最小值

棧的特點

  • 在IA-32平臺上,棧向著較小的地址增長
  • 棧以LIFO(後進先出)的順序移去或增加資料
  • 區域性變數及只存在於函式生命週期的變數隨著棧的取消而結束
  • 每個函式都會有包含區域性變數的棧幀
  • 在每個函式的棧幀之前有儲存的幀指標,返回地址和例程的引數。
  • 棧幀在預處理期間構造,在掃尾例程執行期間取消

預處理執行:

首先把呼叫幀裡下一條指令的地址壓入棧,接下來把當前棧的基址(EBP)儲存到棧上push操作,

然後把ESP暫存器複製到EBP暫存器裡mov操作,最後把ESP暫存器裡的值減去一部分,從而為函式裡的變數分配空間,當函式被呼叫時,函式的引數以逆序壓入棧(或者是最後的先壓入)。預處理對應的彙編指令如下:

push ebp
mov ebp,esp
sub esp, 0x1234

常用指令

mov

作用時把一個特定型別的運算元複製到另一個運算元

and

把運算元與源運算元按位做AND操作,並把結果儲存在目標數。

如果兩個位都是1則輸出1,否則輸出0.

not

逐位對單一運算元做NOT操作,將1設為0,反之亦然。

or

逐位對運算元做OR操作,它按位比較兩個運算元,當比較的兩個

位都為0時它才輸出0,否則輸出1

xor

逐位比較源運算元與目標運算元,並把結果儲存到目標運算元,

如果被比較的兩個位不一樣才輸出1,否則輸出0.

test

逐位對第一個和第二個運算元做AND操作,根據結果設定EFLAGS

暫存器中的標誌,此指令並不儲存操作結果。

cmp

該指令比較兩個運算元的大小,用它的目標數減去源運算元,並根據結果設定EFLAGS暫存器的標誌。使用方式類似test,主要用於比較操作

lea(取有效地址指令)

該指令計算源運算元指定的地址,並把結果儲存在目標運算元中

它用於多個暫存器間做算術運算,並不修改源運算元。

jmp

該指令把執行控制權交給它的運算元。可以執行4中不同型別的跳轉

近跳轉、短跳轉、遠跳轉和任務切換。

近跳轉的目的地址只能在當前程式碼段裡。

短跳轉可以跳到與當前地址相距-128到127的地址內

遠跳轉可以跳到地址空間裡任何一個段裡,前提是他們與當前程式碼段同樣的特權級

任務切換跳轉則可以跳到不同的任務裡。

jcc

它是一系列條件跳轉命令的統稱。具體條件隨著使用的指令有所變化,

基本是搭配都是test與cmp指令使用

call

設定棧,使處理器在被呼叫的函式執行完成後可以恢復執行

ret

它是call指令的搭檔。可以從棧裡獲取儲存的元資料,彈出元資料並返回那個地址。

它後面帶的立即運算元指定率在執行返回後從棧上彈出多少個位元組。

EFLAGS暫存器

它是32位暫存器,包含一組狀態,系統標誌以及控制狀態,每個標誌由暫存器裡一位代表,

1、狀態標誌(Status Flags)
EFLAGS暫存器的狀態標誌(0、2、4、6、7以及11位)指示算術指令(如ADD, SUB, MUL以及DIV指令)的結果,這些狀態標誌的作用如下:

  • CF(bit 0) [Carry flag] 進位標誌,若算術操作產生的結果在最高有效位(most-significant bit)發生進位或借位則將其置1,反之清零。這個標誌指示無符號整型運算的溢位狀態,這個標誌同樣在多倍精度運算(multiple-precision arithmetic)中使用。
  • PF(bit 2) [Parity flag] 奇偶標誌,如果結果的最低有效位元組(least-significant byte)包含偶數個1位則該位置1,否則清零。
  • AF(bit 4) [Adjust flag] 輔助進位標誌,如果算術操作在結果的第3位發生進位或借位則將該標誌置1,否則清零。這個標誌在BCD(binary-code decimal)算術運算中被使用。
  • ZF(bit 6) [Zero flag] 零標誌,若結果為0則將其置1,反之清零。
  • SF(bit 7) [Sign flag] 符號標誌,該標誌被設定為有符號整型的最高有效位。(0指示結果為正,反之則為負)
  • OF(bit 11) [Overflow flag] 溢位標誌如果整型結果是較大的正數或較小的負數,並且無法匹配目的運算元時將該位置1,反之清零。這個標誌為帶符號整型運算指示溢位狀態。

2、DF(bit10)標誌(DF flag)
方向標誌,這個方向標誌(位於EFLAGS暫存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。設定DF標誌使得串指令自動遞減(從高地址向低地址方向處理字串),清除該標誌則使得串指令自動遞增。STD以及CLD指令分別用於設定以及清除DF標誌。

3、系統標誌以及IOPL域(System Flags and IOPL Field)
EFLAGS暫存器中的這部分標誌用於控制作業系統或是執行操作,它們不允許被應用程式所修改。這些標誌的作用如下:

  • TF(bit 8) [Trap flag] 陷阱標誌,將該位設定為1以允許單步除錯模式,清零則禁用該模式。
  • IF(bit 9) [Interrupt enable flag]允許中斷標誌 該標誌用於控制處理器對可遮蔽中斷請求(maskable interrupt requests)的響應。置1以響應可遮蔽中斷,反之則禁止可遮蔽中斷。
  • IOPL(bits 12 and 13) [I/O privilege level field] I/O特權即標誌,指示當前執行任務的I/O特權級(I/O privilege level),正在執行任務的當前特權級(CPL)必須小於或等於I/O特權級才能允許訪問I/O地址空間。這個域只能在CPL為0時才能通過POPF以及IRET指令修改。
  • NT(bit 14) [Nested task flag] 巢狀任務標誌,這個標誌控制中斷鏈和被呼叫任務。若當前任務與前一個執行任務相關則置1,反之則清零。
  • RF(bit 16) [Resume flag] 恢復標誌,控制處理器對除錯異常的響應。
  • VM(bit 17) [Virtual-8086 mode flag] 虛擬8086標誌, 置1以允許虛擬8086模式,清除則返回保護模式。
  • AC(bit 18) [Alignment check flag] 對齊檢查標誌,該標誌以及在CR0暫存器中的AM位置1時將允許記憶體引用的對齊檢查,以上兩個標誌中至少有一個被清零則禁用對齊檢查。
  • VIF(bit 19) [Virtual interrupt flag] 虛擬中端標誌,該標誌是IF標誌的虛擬映象(Virtual image),與VIP標誌結合起來使用。使用這個標誌以及VIP標誌,並設定CR4控制暫存器中的VME標誌就可以允許虛擬模式擴充套件(virtual mode extensions)
  • VIP(bit 20) [Virtual interrupt pending flag] 虛擬中斷標誌,該位置1以指示一箇中斷正在被掛起,當沒有中斷掛起時該位清零。【Software sets and clears this flag; the processor only reads it.】與VIF標誌結合使用。
  • ID(bit 21) [Identification flag] 標識標誌,程式能夠設定或清除這個標誌指示了處理器對CPUID指令的支援。

第22位到31位當前被保留。

參考資料:
IDA權威指南
https://blog.csdn.net/jn1158359135/article/details/7761011