感觉这章前面基本上在讲汇编,学过汇编了,看起来还是比较轻松的。就记录一下比较感兴趣的吧。
在x86-64架构的CPU上,有16个寄存器,每个寄存器有64个bit。可以分为多个小寄存器使用。如rax可以(rax eax ax al)
8bit为一个字节,16bit为一个字(Word),32bit为双字,64bit位四字。
mov指令,mov a,b 将a的内容传送到b中。a和b不能同时为内存地址,所以要拷贝内存需要两条指令,先将源值加载到寄存器,再将寄存器的值传送到内存目的地址。
c语言的指针就是一个地址,通过地址的值去寻址,找到内存的实际值。局部变量时放在寄存器中,而不是内存中。
程序栈是内存中的一段区域,表现为后进先出。插入删除那一端称为栈顶,栈顶元素是所有栈中元素地址中最低的。
汇编指令:pushq %rax 会将rax寄存器的值push到栈顶。过程是rsp寄存器的值是栈顶的地址,所以rsp的值先减8,然后将rax的值存到rsp指向的地址。由于栈顶是低地址区域,栈低是高地址,若将pushq分成两部的话,一定是要先更新rsp寄存器的值,再move元素。
popq %rdx是将栈顶元素弹出到rdx寄存器中。rsp的值要对应加8。