寄存器

寄存器
体系结构 长度 名称

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
的指令寄存器,并让新线程再次执行。可以看出操作系统正是通过这种机制保证了即使是多线程运行时也不会导致寄存器的内容发生错乱的问题。因为每当线程切换时操作系统都帮它们将数据处理好了。
函数调用时的寄存器复用

解决的方法就是高级语言里面的每一行代码在编译为机器指令时总是先将数据从内存读取到寄存器中,处理完毕后立即写回到内存中去,中间并不将数据进行任何在寄存器上的缓存
1432482-02b548861ac4928a.png


0.jpg

你可能感兴趣的:(寄存器)