视频地址:
http://player.bilibili.com/player.html?aid=31289365&bvid=BV1iW411d7hd&cid=65303695&page=7
课件地址:
对应于书本的3.7。
如有错误请指出,谢谢。
小点:
C中的取地址符&
返回的是内存地址,所以一定要保存在内存中。
保存到内存中进行参数传输时,要求每个参数大小为8字节的倍数,即要求相对%rsp
的偏移量为8的倍数
不会显示地操作程序计数器寄存器%rip
,没有指令可以对其操作,只能通过类似call
或ret
间接对其操作。
栈顶指针%rsp
是随着函数运行不断变化的。
函数可以假设“被调用者保存寄存器”的值是不变的,而可以用“调用者保存寄存器”来保存临时值。
某个函数要永久使用的值,要么保存在“被调用者保存寄存器”中,要么保存在内存中。
当函数需要使用“被调用者保存寄存器”时,就直接将其push
到栈中,使用过后再pop
重置。
无论是“被保存的寄存器”还是“局部变量”以及“参数构造区”,一开始如何申请这些区域,后面使用完后还会逆向地通过%rsp
将这些区域释放掉,这是动态的过程,使得一个函数运行完时,%rsp
指向的就是返回地址,就能直接通过ret
返回到调用者的断点处。
进入一个函数时,首先将要使用的“被调用者保存寄存器”push
到栈中,然后通过%rsp
来申请一段固定大小的空间,用来存放局部变量和参数构造区,最后再释放申请的空间。