利用汇编挖掘编程语言本质
Get
1. 汇编代码和二进制代码一一对应,
- 每一句汇编代码和二进制代码一一对应,所以二进制代码可以反汇编出汇编代码(伪代码,不一定百分之百准确),
- 汇编代码根据平台不同会有所不同,x86,armv7,arm64等,由于不同平台会有不同的指令集,所以同样的高级语言编译出来的汇编代码可能会不同,但是大同小异
2. ifelse和switch的效率
- 通过汇编可发现,某些情况下,switch效率会比ifelse高(case比较多,且相互之间差值不大,如果差值非常大会用类似ifelse的处理方式),因为ifelse会执行每一个情况的判断代码,不符合则跳转下一个,最终执行完所有的ifelse,
- switch则会通过一定算法,直接算出结果,然后跳转到相应的语句的内存地址
3. 函数的内存分布
- 函数的调用会开辟栈空间,栈空间会有指针(esp,平台不同名称可能不同)标识栈顶的位置
- 每次压栈都会更新栈顶,函数栈空间会存储局部变量等,每次函数执行完成,esp都会回到调用函数前的位置,这叫做栈平衡,防止栈溢出
- 因为每次调用函数都会开辟栈空间,esp都会移动到栈顶,所以递归函数如果没有退出条件,esp会一直移动,直到栈空间不足,栈溢出程序报错
- esp只是标识栈顶的位置,所标记内存地址之下(更小的地址)被视为未使用内存,可以分配给新的函数或变量使用,但其实每次使用后,内存中存储的数据还在,只是被标记为未使用,下次使用可以直接覆盖内容
- 本文标题:利用汇编挖掘编程语言本质
- 本文作者:Lazyloading
- 创建时间:2020-07-05 15:46:39
- 本文链接:https://lazy.wiki/posts/2102ad03/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!