網絡安全編程:x86匯編語言之寄存器
任何程序的執行,歸根結底,都是存放在存儲器里的指令序列執行的結果。寄存器用來存放程序運行中的各種信息,包括操作數地址、操作數及運算的中間結果等。下面來熟悉各種寄存器。
1. CPU工作模式
x86體系的CPU有兩種基本的工作模式,分別是實模式和保護模式。
實模式也稱為實地址模式,實現了Intel 8086處理器的程序設計環境。該模式被早期的Win 9x和DOS所支持。實模式下可以訪問的內存為1MB。實模式可以直接訪問硬件,比如直接對端口進行操作,對中斷進行操作。現在的CPU仍然支持實模式,一是為了與早期的CPU架構保持兼容,二是因為所有的x86架構處理器都是從實模式引導起來的。
保護模式是處理器主要的工作模式,Linux和Windows NT內核的系統都工作在x86的保護模式下。保護模式下,每個進程可以訪問的內存地址為4GB,且進程間是隔離的。
2. 基本寄存器
寄存器是CPU內部的高速存儲單元,訪問速度比內存快得多,而價格也高很多(在單位價格內,寄存器的價格要比內存貴,內存要比硬盤貴)。CPU中,常用的寄存器分為4類,分別是8個通用寄存器、6個段寄存器、1個標志寄存器和1個指令指針寄存器,如圖1所示。
圖1 x86處理器的基本寄存器
(1)通用寄存器
通用寄存器主要用于各種運算和數據的傳送,每個寄存器都可以作為一個32位、16位或8位來使用,如圖2所示。
圖2 通用寄存器示意圖(一)
對于圖2來說,可以將一個寄存器分別當8位、16位或32位來使用。EAX寄存器可以存儲32位的數據。EAX的低16位可以表示為AX,可以存儲16位的數據。AX寄存器又可分為AH和AL兩個8位的寄存器,AH對應AX寄存器的高8位,AL對應AX寄存器的低8位。
只有數據存儲寄存器可以按照這樣的方式進行使用。由圖1可知,數據存儲寄存器有EAX、EBX、ECX和EDX 4個。
(2)通用寄存器的使用方式及特殊用途
指針變址寄存器可以按照32位或16位進行使用,如圖3所示。
圖3 通用寄存器示意圖(二)
對于圖3來說,只可以將一個寄存器分為32位或16位進行使用。ESI寄存器可以存儲32位的指針,其中低16位可以表示為SI,存儲16位的指針,但是無法像AX那樣能拆分成高8位和低8位。
各通用寄存器可以使用的方式如圖4所示。
圖4 各通用寄存器可以使用的方式
關于通用寄存器中有部分寄存器有特殊用途:
① EAX在乘法和除法指令中被自動使用;
② CPU自動使用ECX作為循環計數器;
③ ESP尋址堆棧(準確地講,應該是棧,其實“堆”是“堆”,“棧”是“棧”,就如同“刀劍”雖然合起來稱呼,其實是兩種不同的兵器)上的數據,ESP寄存器一般不參與算數運算,通常稱為棧指針寄存器;
④ ESI和EDI通常用于內存數據的高速傳送,被稱為源指針寄存器和目的指針寄存器;
⑤ EBP由高級語言用來引用參數和局部變量,通常被稱為棧幀基址指針寄存器。
(3)指令指針寄存器
指令指針寄存器EIP是一個32位的寄存器。在16位的環境中,其名稱為IP。EIP寄存器通常保存著下一條要執行的指令的地址。下一條指令的地址為當前指令的地址加當前指令的長度。
特殊(其實也算不上通常與特殊)情況是當前指令為一條轉移指令,比如JMP、JE、LOOP等指令,會改變EIP的值,導致CPU執行指令產生跳躍性執行,從而構成分支與循環的程序結構。
EIP中的值始終在引導CPU的執行。
(4)段寄存器
段寄存器被用于存放段的基地址,段是一塊預分配的內存區域。有些段存放有程序的指令,有些則存放有程序的變量,另外還有其他的段,如堆棧段存放著函數變量和函數參數等。在16位CPU中,段寄存器只有4個,分別是CS(代碼段)、DS(數據段)、SS(堆棧段)和ES(附加段)。
在32位CPU中,段寄存器從4個擴展為6個,分別是CS、DS、SS、ES、FS和GS。FS和GS段寄存器也屬于附加的段寄存器。
(5)標志寄存器
在16位CPU中,標志寄存器稱為FLAGS(有的書上是PSW,即程序狀態字寄存器)。在32位CPU中,標志寄存器也隨之擴展為32位,被稱為EFLAGS。
關于標志寄存器,16位CPU中的標志已經滿足于日常的程序設計所用,這里主要介紹16位CPU中的標志。標志寄存器如圖5所示。
圖5 16位的標志寄存器
圖5說明,標志寄存器中的每一個標志位只占1位,而16位的標志寄存器并沒有全部使用。16位的標志寄存器分為兩部分,分別是條件標志和控制標志。
條件標志寄存器說明如下。
① OF(Overflow Flag):溢出標志位,溢出時為1,否則為0。
② SF(Sign Flag):符號標志,運算結果為負時,為1,否則為0。
③ ZF(Zero Flag):零標志,運算結果為0時,為1,否則為0。
④ (Auxiliary carry Flag):輔助進位標志,記錄運算時第3位(半字節)產生的進位,有進位時為1,否則為0。
⑤ (Parity Flag):奇偶標志,結果操作數中1的個數為偶數時,為1,否則為0。
⑥ CF(Carry Flag):進位標志,產生進位時為1,否則為0。
控制標志寄存器說明如下。
① DF(Direction Flag):方向標志,在串處理指令中用于控制方向。
② IF(Interrupt Flag):中斷標志。
③ TF(Trap Flag):陷阱標志。
在日常的使用過程中,較為常用的標志有CF、PF、ZF、SF、DF和OF。
16位CPU中的標志在32位CPU中繼續使用,32位擴展了4個新的標志位。