register 关键字
register 关键字是c/c++ 里面唯一能操作寄存器的指令,强制将数据存放在寄存器里,而不是放在堆栈里,这样读写速度最快。
而汇编语言强大之处是能直接操作寄存器,且可以指定使用哪些寄存器。
通过汇编一段代码来演示register的作用
先是c语言代码
1 | int main(){ |
对应的汇编
1 | main: |
没有register关键字的时候
1 | int main(){ |
1 | main: |
可见,当register修饰int i时, i的值存放在%ebx里,当没有register修饰时,i的值放在栈里%rbp -8
的位置movl %ebx, -12(%rbp)
可见当register时, j的值复用了ebx的高32位。 此时的内存如下
1 | --- 栈底 |
rbp表示基地址指针,指向的是函数栈的起始地址,这个起始地址只是对于当前函数而言的
rsp表示栈顶指针,指向当前的栈顶
每次函数调用时(main 函数被内核_start_main__
调用):
- 将调用者的函数栈基地址保存起来
- 参数压栈, 可能由调用者压栈,可能由被调用者压栈,影响的是当前的栈顶,继而栈顶影响rbp
- 将被调用函数当前的栈顶复制给基地址寄存器。新的rbp == rsp即当前的栈顶。相当于构造了新的函数运行环境
附录
1 | General-Purpose Registers |