我坚信,从学习一门新语言中获得的最重要的事情之一不是如何使用新语言,而是从中获得的概念知识.我不是说你认为大会是多么重要或有用,如果我从未在任何真实的项目中使用它,我也不在乎.
我想知道的是,您认为大会的哪些概念对于任何一般程序员来说都是最重要的?它没有直接关系到大会 - 它也可以是你觉得谁花所有的时间都在高级语言不理解或想当然,比如CPU缓存典型的程序员的东西.
汇编使您可以非常了解CPU可以同时处理多少变量(机器字大小的整数).如果你可以打破你的循环,使它们只涉及一些临时变量,它们都将适合寄存器.如果没有,当你把东西换成内存时,你的循环会慢慢运行.
这对我的C编码真的有帮助.我试着让所有的环都紧凑而简单,尽可能少的意大利面条.
学习几种汇编语言让我意识到x86指令集是多么蹩脚.可变长度指令?很难预测时间?非正交寻址模式?啊.
如果我们都运行MIPS,我认为,甚至是ARM或PowerPC,那么世界会更好:-)或者更确切地说,如果英特尔/ AMD采用他们的半导体专业技术并用它来制造多核,超快,超便宜的MIPS处理器而不是具有所有这些兑换品质的x86处理器.
我认为汇编语言可以教你许多小事,以及一些大概念.
我将在这里列出一些我能想到的东西,但是没有什么可以替代学习和使用x86和RISC指令集.
您可能认为整数运算最快.如果要查找整数的整数平方根(即floor(sqrt(i))),最好使用仅整数近似例程,对吧?
罗.数学协处理器(在x86上)有一个fsqrt指令.转换为float,取平方根,再次转换为int比全整数算法更快.
然后有一些东西,比如访问你可以遵循的记忆,但是没有正确的推荐,直到你钻研到装配.假设您有一个链表,并且列表中的第一个元素包含您需要经常访问的变量.该列表很少重新排序.好吧,每次需要访问该变量时,需要将指针加载到列表中的第一个元素,然后使用它,加载变量(假设您不能在使用之间将变量的地址保存在寄存器中) .如果您将变量存储在列表之外,则只需要一次加载操作.
当然在这里节省几个周期,这些天通常不重要.但是,如果您计划编写需要快速的代码,这种知识既可以应用于内联汇编,也可以应用于其他语言.
调用约定怎么样?(有些汇编程序会为你处理这个问题 - 真正的程序员不会使用它们.)调用者或被调用者是否清理堆栈?你甚至使用堆栈?您可以在寄存器中传递值 - 但由于有趣的x86指令集,最好在某些寄存器中传递某些内容.哪些寄存器将被保留?C编译器无法自行优化的一件事就是调用.
有一些小技巧,比如PUSHing一个返回地址,然后JMPing到一个程序; 当程序返回时,它将转到PUSHed地址.这种偏离通常的函数调用思维方式是另一种"启蒙状态".如果您曾经设计过具有创新功能的编程语言,那么您应该了解硬件能够实现的有趣事物.
汇编语言知识可以教您有关计算机安全的特定于体系结构的知识.如何利用缓冲区溢出,或进入内核模式,以及如何防止此类攻击.
然后是自修改代码的超低温,以及作为相关问题的机制,例如重定位和将补丁应用于代码(这也需要调查机器代码).
但所有这些都需要正确的思想.如果你是那种可以放的人
while(x--) { ... }
一旦你了解它的作用就会很好用,但会发现很难弄清楚它自己做了什么,那么汇编语言可能是浪费你的时间.