Goto is not a bad habit
ABI- application binary interface 程序二进制接口 all the parts of a system —manage the machine machine level
Windows has his own ABI and MAC os
传参:get communicate And: it located that should get delocated or should be freed up
Just a bunch of arrays 管理过程调用与返回状态 后进先出 %rsp—栈顶 在高地址 —每次加东西 往低地址走 倒着来—-头在脚下 pushq dest popq dest store value at dest—-must be register
call label ret
神奇的办法,通过地址传递,做到两数相加
movl %esi编译器这样做是因为它可以少移动一个四个字节 leaq 来传递指针
最后栈顶回退16个字节-释放栈空间
ret始终会把栈指针指向的地址作为返回地址
所以%rsp在ret前执行 回到该回到的地方
—-
我们会把那些可能被用到的寄存器存在栈帧里面。在要call别的函数之前。
一个神奇方法去计算一个数字有多少1: 巧妙利用返回的 rax
成对出现的push pop rbx 是用来保存 弹出rbx临时值的
可以看出 在return里面 先计算两个表达式的值保存在寄存器然后再去call,我们要知道 call完以后他肯定rax保存了返回值
与此同时在call的时候我明白,在call之前rbx设置为右移后的值,当返回时,我们知道rbx存储了x的最低有效位,
所以我们可以把二者相加
最后的返回值rax就是最后的结果
疑问🤔️如果最后一轮popq rbx 会执行 L6 rep吗
总之rbp不管如何修改,在返回的时候都会是被恢复前面的值 保护现场机制
这就是ABI标准制定的意义
所有被调用函数都有恢复寄存器环境的责任
栈正好可以达到这个效果 被调用者 callee有责任把那些寄存器值保存到自己的栈帧里面
最后做好lab的题目