理论 – 在大会中学习的关键概念

我坚信,从学习一门新语言中获得的最重要的事情之一不是如何使用新语言,而是从中获得的概念知识.我不是说你认为大会是多么重要或有用,如果我从未在任何真实的项目中使用它,我也不在乎.

我想知道的是,您认为大会的哪些概念对于任何一般程序员来说都是最重要的?它不必与Assembly直接相关 – 它也可能是你认为典型的程序员在高级语言中花费所有时间不会理解或理所当然的事情,例如CPU缓存.

我认为汇编语言可以教你很多小东西,以及一些大概念.

我将在这里列出一些我能想到的东西,但是没有什么可以替代学习和使用x86和RISC指令集.

您可能认为整数运算最快.如果要查找整数的整数平方根(即floor(sqrt(i))),最好使用仅整数近似例程,对吧?

罗.数学协处理器(在x86上)有一个fsqrt指令.转换为float,取平方根,再次转换为int比全整数算法更快.

然后有一些东西,比如访问你可以遵循的内存,但是没有正确的推荐,直到你钻研到汇编.假设您有一个链表,并且列表中的第一个元素包含您需要经常访问的变量.该列表很少重新排序.好吧,每次需要访问该变量时,需要将指针加载到列表中的第一个元素,然后使用它,加载变量(假设您不能在使用之间将变量的地址保存在寄存器中) .如果您将变量存储在列表之外,则只需要一次加载操作.

当然,在这里节省几个周期,这些天通常不重要.但是,如果您计划编写需要快速的代码,这种知识既可以应用于内联汇编,也可以应用于其他语言.

调用约定怎么样? (有些汇编程序会为你处理这个问题 – 真正的程序员不会使用它们.)调用者或被调用者是否清理堆栈?你甚至使用堆栈?您可以在寄存器中传递值 – 但由于有趣的x86指令集,最好在某些寄存器中传递某些内容.哪些寄存器将被保留? C编译器无法真正优化的一件事就是调用.

有一些小技巧,如推送一个返回地址,然后JMPing到一个程序;当程序返回时,它将转到PUSHed地址.这种偏离通常的函数调用思维方式是另一种“启蒙状态”.如果你曾经设计过具有创新功能的编程语言,你应该知道硬件能够做的有趣事情.

汇编语言知识可以教您有关计算机安全的特定于体系结构的知识.如何利用缓冲区溢出,或进入内核模式,以及如何防止此类攻击.

然后是自修改代码的超低温,以及作为相关问题的机制,例如重定位和将补丁应用于代码(这也需要调查机器代码).

但所有这些都需要正确的思想.如果你是那种可以投入的人

while(x--)
{
  ...
}

一旦你了解它做了什么就可以很好地使用,但是会发现很难弄清楚它自己做了什么,那么汇编语言可能是浪费你的时间.

相关文章
相关标签/搜索