文章目录
- Machine-level programming
- Basic and Control
- Procedures
- Procedures
- stack structure
- calling conventions
- passing control
- passing data
- managing local data
- illustration of recursion
Machine-level programming
Basic and Control
Goto is not a bad habit
Procedures
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
Procedures
stack structure
Just a bunch of arrays 管理过程调用与返回状态 后进先出 %rsp—栈顶 在高地址 —每次加东西 往低地址走 倒着来—-头在脚下 pushq dest popq dest store value at dest—-must be register
calling conventions
passing control
call label ret
passing data
神奇的办法,通过地址传递,做到两数相加
movl %esi编译器这样做是因为它可以少移动一个四个字节 leaq 来传递指针
最后栈顶回退16个字节-释放栈空间
ret始终会把栈指针指向的地址作为返回地址
所以%rsp在ret前执行 回到该回到的地方
—-
我们会把那些可能被用到的寄存器存在栈帧里面。在要call别的函数之前。
managing local data
illustration of recursion
一个神奇方法去计算一个数字有多少1: 巧妙利用返回的 rax
成对出现的push pop rbx 是用来保存 弹出rbx临时值的
可以看出 在return里面 先计算两个表达式的值保存在寄存器然后再去call,我们要知道 call完以后他肯定rax保存了返回值
与此同时在call的时候我明白,在call之前rbx设置为右移后的值,当返回时,我们知道rbx存储了x的最低有效位,
所以我们可以把二者相加
最后的返回值rax就是最后的结果
疑问