寄存器
體系結(jié)構(gòu) 長度 名稱
x64 64 RAX,RBX,RCX,RDX,RDI,RSI, R8-R15
x64 32 EAX,EBX,ECX,EDX,EDI,ESI, R8D-R15D
x64 16 AX,BX,CX,DX,DI,SI, R8W-R15W
x64 8 AL,BL,CL,DL,DIL,SIL, R8L-R15L
arm64 64 X0-X30, XZR
arm64 32 W0-W30, WZR
EAX
EBX
ECX
EDX
EDI
ESI
EBP
ESP
_add_a_and_b:push%ebx
mov%eax,[%esp+8]
mov%ebx,[%esp+12]
add%eax,%ebx
pop%ebx
ret
_main:push3push2call_add_a_and_b
add%esp,8
ret
線程切換時的寄存器復用
具體的實現(xiàn)是每創(chuàng)建一個線程時都會為這線程創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu)來保存這個線程的信息,我們稱這個數(shù)據(jù)結(jié)構(gòu)為線程上下文,每個線程的上下文中有一部分數(shù)據(jù)是用來保存當前所有寄存器的副本。每當操作系統(tǒng)暫停一個線程時,就會將CPU中的所有寄存器的當前內(nèi)容都保存到線程上下文數(shù)據(jù)結(jié)構(gòu)中。而操作系統(tǒng)要讓另外一個線程執(zhí)行時則將要執(zhí)行的線程的上下文中保存的所有寄存器的內(nèi)容再寫回到CPU中,并將要運行的線程中上次保存暫停的指令也賦值給CPU
的指令寄存器,并讓新線程再次執(zhí)行??梢钥闯霾僮飨到y(tǒng)正是通過這種機制保證了即使是多線程運行時也不會導致寄存器的內(nèi)容發(fā)生錯亂的問題。因為每當線程切換時操作系統(tǒng)都幫它們將數(shù)據(jù)處理好了。
函數(shù)調(diào)用時的寄存器復用

二
