其中有一個寄存器叫做EIP(Instruction Pointer,指令寄存器),程序的執行就是靠EIP的不斷增加來完成的(跳轉的話,EIP就變成了跳轉到的地址)。在Windows系統下,進程並不擁有EIP,那麼只有進程,一個程序就無法運行。而擁有這些寄存器的是線程,所以說進程是靜態的。一個CPU下只有一個EIP,也就是說同一時刻只能有一個線程可以運行,那麼所說的多線程又是什麼呢?事實上同一時刻也只有一個線程在運行,每個線程運行一段時間後,它會把它擁有的EIP等寄存器讓出來,其它線程佔有這些寄存器後,繼續運行。
爲了實現不同的線程之間的轉換,CPU要求操作系統維護一份固定格式的數據(該數據存在於內存中),這份數據叫做Task-State Segment(TSS),在這份數據結構裏,維護着線程的EAX,EIP,DS(Data Segment)等寄存器的內容。
EAX—EDX可稱爲數據寄存器,你除了直接訪問外,還可分別對其高十六位和低十六位進行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問,也就是說,AX還可以再進行分解,即AX還可分爲AH(高八位)AL(低八位)。
在32位程序中,32位以內的函數返回值都通過eax寄存器來傳遞——這是__stdcall和__ccall的調用約定形成的結果。Win32API函數(wsprintf使用__cdecl調用規則,其餘所有API函數都是用__stdcall調用規則)默認是是用eax返回值。高級語言特性+編譯器,通常將函數的返回值放在EAX中(單一返回值直接放EAX,如果多個返回值,則EAX中存放指針)。
│ EAX │
│ AX │
│ AH │ AL │
而CPU還有一個寄存器叫做Task Register(TR),該寄存器指向當前正在執行的線程的TSS。而線程切換事實上就是TR指向不同的TSS,這樣CPU就會自動保存當前的EAX,EBX的信息到相應的TSS中,並將新的線程的信息加載到寄存器。
32位CPU的寄存器包括:
4個數據寄存器 :
EAX (Accumulator)
EBX (Base Register)
ECX (Count Register)
EDX (Data Register)
2個變址和指針寄存器(Index Register) :
ESI (Source Index Register)
EDI (Destination Index Register)
1個指令指針寄存器 :
EIP (Instruction Pointer)
2個指針寄存器(Pointer Register) :
ESP (Stack Pointer Register)
EBP (Base Pointer Register)
6個段寄存器(Segment Register)
CS (Code Segment Register)
DS (Data Segment Register)
SS (Stack Segment Register)
ES (Extra Segment Register)
FS (Extra Segment Register)
GS (Extra Segment Register)
1個標誌寄存器 :
EFlags