寄存器
体系结构 长度 名称
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
线程切换时的寄存器复用
具体的实现是每创建一个线程时都会为这线程创建一个数据结构来保存这个线程的信息,我们称这个数据结构为线程上下文,每个线程的上下文中有一部分数据是用来保存当前所有寄存器的副本。每当操作系统暂停一个线程时,就会将CPU中的所有寄存器的当前内容都保存到线程上下文数据结构中。而操作系统要让另外一个线程执行时则将要执行的线程的上下文中保存的所有寄存器的内容再写回到CPU中,并将要运行的线程中上次保存暂停的指令也赋值给CPU
的指令寄存器,并让新线程再次执行。可以看出操作系统正是通过这种机制保证了即使是多线程运行时也不会导致寄存器的内容发生错乱的问题。因为每当线程切换时操作系统都帮它们将数据处理好了。
函数调用时的寄存器复用
二
0.jpg
网友评论