組合語言裡 eax, ebx, ecx, edx, esi, edi, ebp, esp這些都是什麼意思啊?
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 組合語言中CPU上的通用暫存器的名稱,是32位的暫存器。如果用C語言來解釋,可以把這些暫存器當作變數看待。
比方說:add eax,-2 ; //可以認為是給變數eax加上-2這樣的一個值。
這些32位暫存器有多種用途,但每一個都有“專長”,有各自的特別之處。
EAX 是"累加器"(accumulator), 它是很多加法乘法指令的預設暫存器。
EBX 是"基地址"(base)暫存器, 在記憶體定址時存放基地址。
ECX 是計數器(counter), 是重複(REP)字首指令和LOOP指令的內定計數器。
EDX 則總是被用來放整數除法產生的餘數。
ESI/EDI分別叫做"源/目標索引暫存器"(source/destination index),因為在很多字串操作指令中, DS:ESI指向源串,而ES:EDI指向目標串.
EBP是"基址指標"(BASE POINTER), 它最經常被用作高階語言函式呼叫的"框架指標"(frame pointer). 在破解的時候,經常可以看見一個標準的函式起始程式碼:
push ebp ;儲存當前ebp
mov ebp,esp ;EBP設為當前堆疊指標
sub esp, xxx ;預留xxx位元組給函式臨時變數.
...
這樣一來,EBP 構成了該函式的一個框架, 在EBP上方分別是原來的EBP, 返回地址和引數. EBP下方則是臨時變數. 函式返回時作 mov esp,ebp/pop ebp/ret 即可.
ESP 專門用作堆疊指標,被形象地稱為棧頂指標,堆疊的頂部是地址小的區域,壓入堆疊的資料越多,ESP也就越來越小。在32位平臺上,ESP每次減少4位元組。
狀態和控制暫存器組除了EFLAGS、IP ,還有四個32位的控制暫存器,它們是CR0,CR1,CR2和CR3。
這幾個暫存器中儲存全域性性和任務無關的機器狀態。
CR0中包含了6個預定義標誌,0位是保護允許位PE(Protedted Enable),用於啟動保護模式,如果PE位置1,則保護模式啟動,如果PE=0,則在真實模式下執行。1位是監控協處理位MP(Moniter coprocessor),它與第3位一起決定:當TS=1時操作碼WAIT是否產生一個“協處理器不能使用”的出錯訊號。第3位是任務轉換位(Task Switch),當一個任務轉換完成之後,自動將它置1。隨著TS=1,就不能使用協處理器。CR0的第2位是模擬協處理器位 EM (Emulate coprocessor),如果EM=1,則不能使用協處理器,如果EM=0,則允許使用協處理器。第4位是微處理器的擴充套件型別位ET(Processor Extension Type),其內儲存著處理器擴充套件型別的資訊,如果ET=0,則標識系統使用的是287協處理器,如果 ET=1,則表示系統使用的是387浮點協處理器。CR0的第31位是分頁允許位(Paging Enable),它表示晶片上的分頁部件是否允許工作。
CR1是未定義的控制暫存器,供將來的處理器使用。
CR2是頁故障線性地址暫存器,儲存最後一次出現頁故障的全32位線性地址。
CR3是頁目錄基址暫存器,儲存頁目錄表的實體地址,頁目錄表總是放在以4K位元組為單位的儲存器邊界上,因此,它的地址的低12位總為0,不起作用,即使寫上內容,也不會被理會。
這幾個暫存器是與分頁機制密切相關的,因此,在程序管理及虛擬記憶體管理中會涉及到這幾個暫存器,讀者要記住CR0、CR2及CR3這三個暫存器的內容。