作者:爱写程序的阿波张
版权:转载请注明出处
公众号:go语言核心编程技术
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第二小节。
寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU的工作原理决定了有些操作运算只能在CPU内部进行,二是因为CPU读写寄存器的速度比读写内存的速度快得多。
为了便于交流和使用汇编语言进行编程,CPU厂商为每个寄存器都取了一个名字,比如AMD64 CPU中的rax, rbx, rcx, rdx等等,这样程序员就可以很方便的在汇编代码中使用寄存器的名字来进行编程,为了对寄存器的使用有个直观的感受,我们用个例子来简单的说明一下。
假设有如下go语言编写的一行代码:
c = a + b
在AMD64 Linux平台下,使用go编译器编译它可得到如下AT&T格式的汇编代码(如果对汇编代码不熟悉的话可以直接看每一条指令后面的注释,不影响我们理解):
mov (%rsp),%rdx #把变量a的值从内存中读取到寄存器rdx中
mov 0x8(%rsp),%rax #把变量b的值从内存中读取到寄存器rax中
add %rdx,%rax #把寄存器rdx和rax中的值相加,并把结果放回rax寄存器中