eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 彙編語言中CPU上的通用寄存器的名稱,是32位的寄存器。如果用C語言來解釋,可以把這些寄存器當作變量看待。 比方說:add eax,-2 ; //可以認為是給變量eax加上-2這樣的一個值。 這些32位寄存器有多種用途,但每一個都有各自的特別之處。 EAX:累加寄存器,相對於其他寄存器,在運算方面比較常用。 EBX:基地址寄存器,作為內存偏移指針使用。 ECX:計數器,用於特定的技術。 EDX:作為EAX的溢出寄存器,(除法產生的餘數)。 EIP:存儲CPU下次所執行的指令地址(存放指令偏移地址)。 ESP:指針的寄存器,用於堆棧操作。被形象地稱為棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就越來越小。在32位平台上,ESP每次減少4字節。 EBP:基址指針,指棧的棧底指針。 它最經常被用作高級語言函數調用的"框架指針"(frame pointer). 在破解的時候,經常可以看見一個標準的函數起始代碼: push ebp ;保存當前ebp mov ebp,esp ;EBP設為當前堆棧指針 sub esp, xxx ;預留xxx字節給函數臨時變量. ... 這樣一來,EBP 構成了該函數的一個框架, 在EBP上方分別是原來的EBP, 返回地址和參數. EBP下方則是臨時變量. 函數返回時作 mov esp,ebp/pop ebp/ret 即可. ESI:在內存操作指令中作為“源地址指針”使用。 EDI:在內存操作指令中作為“目的地址”使用。 MOV:將源操作數送至目的操作數。 PUSH:入棧指令,將源操作數指定的字數據壓入堆棧棧頂。 POP:出棧操作,將源操作數指定的字數據壓入堆棧棧頂。 JMP:跳轉至指定地址執行。 LEA:取有效地址(偏移地址)至寄存器。 CALL:將程序的執行交給其他代碼段。 RET:子程序的返回指令。
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 彙編語言中CPU上的通用寄存器的名稱,是32位的寄存器。如果用C語言來解釋,可以把這些寄存器當作變量看待。 比方說:add eax,-2 ; //可以認為是給變量eax加上-2這樣的一個值。 這些32位寄存器有多種用途,但每一個都有各自的特別之處。 EAX:累加寄存器,相對於其他寄存器,在運算方面比較常用。 EBX:基地址寄存器,作為內存偏移指針使用。 ECX:計數器,用於特定的技術。 EDX:作為EAX的溢出寄存器,(除法產生的餘數)。 EIP:存儲CPU下次所執行的指令地址(存放指令偏移地址)。 ESP:指針的寄存器,用於堆棧操作。被形象地稱為棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就越來越小。在32位平台上,ESP每次減少4字節。 EBP:基址指針,指棧的棧底指針。 它最經常被用作高級語言函數調用的"框架指針"(frame pointer). 在破解的時候,經常可以看見一個標準的函數起始代碼: push ebp ;保存當前ebp mov ebp,esp ;EBP設為當前堆棧指針 sub esp, xxx ;預留xxx字節給函數臨時變量. ... 這樣一來,EBP 構成了該函數的一個框架, 在EBP上方分別是原來的EBP, 返回地址和參數. EBP下方則是臨時變量. 函數返回時作 mov esp,ebp/pop ebp/ret 即可. ESI:在內存操作指令中作為“源地址指針”使用。 EDI:在內存操作指令中作為“目的地址”使用。 MOV:將源操作數送至目的操作數。 PUSH:入棧指令,將源操作數指定的字數據壓入堆棧棧頂。 POP:出棧操作,將源操作數指定的字數據壓入堆棧棧頂。 JMP:跳轉至指定地址執行。 LEA:取有效地址(偏移地址)至寄存器。 CALL:將程序的執行交給其他代碼段。 RET:子程序的返回指令。