关于汇编
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于汇编相关的知识,希望对你有一定的参考价值。
C/C++程序员一定要有考虑汇编、堆栈状态、符号表、编译器的能力。在离开学校开始求职的那一刻,如果尚不能做到这一点,那么要选择走C/C++这条路难度大大提升。如果自己写过编译器,哪怕是最简单的玩具型编译器,会有极大帮助。不然,没必要自找麻烦用C/C++。
如果写程序的时候心里明了堆栈状态、符号表状态、编译器状态,其实不会汇编也没什么。可惜,如果一个人不会汇编,要理解这三者实在是太难了。反过来,如果理解了这三者,基本上边写代码边人肉转汇编都是自然而然的事情。
- 不考虑符号表的,容易出Linker Error且看不懂Linker Errorr,容易分不清什么时候该include什么时候forward declare就行,对function signature、template、inline理解肯定也不会很到位。
- 不考虑堆栈状态的,看到指针就发怵,用不好Allocator,动态分配时分不清应该直接从堆上动态分配好,还是从栈上开buffer分配内存,会把栈上变量的指针bind给async callback函数。
- 不考虑编译器的,容易写出带二义性的代码,面对GCC的错误一半时间都得抓瞎,分不清runtime和compile time,于是template meta programming啥的也就别谈了。
- 不考虑汇编的,虚函数和非虚函数的继承,vptr,信号和中断处理函数一些诡异的特性,转型中的内存截断,强制类型转换,指针,线程切换,保存现场、上下文恢复也会理解不到位。
至于其他语言,人肉汇编不是必须的技能。毕竟,那些高级语言,存在的目的就是为了对底层进行抽象。如果对汇编有所了解,那很好,某个语言的某一个独特feature为什么这么设计,支持这个特性的代价是什么,会一目了然。
而C/C++,在我看来是特殊的,这两个语言(在我看来)完全是为了“更快更好地 用现代软件工程的方法 写出接近汇编的 细粒度 高性能代码” 而存在的。所以,C/C++程序员必须通晓汇编
以上是关于关于汇编的主要内容,如果未能解决你的问题,请参考以下文章