什么是学习Assembly的最佳方式? 具体来说,对于有dynamic语言经验的人来说

我一直在使用Python已经有相当长的一段时间了,我非常喜欢它的易用性和灵活性,但是我真的想更接近我正在开发的一些math的硬件。 我也对如此接近硬件很感兴趣,绝对没有什么能阻止你使用它的一切。

我已经研究过对大会的介绍,对我来说,他们的工作比他们应该做得更快。 他们直接跳进登记册和行动,却没有解释他们到底是什么,为什么他们很重要。

我很想看到Assembly的深入介绍,以确保您在进行任何types的编程之前了解这些概念。

正如其他人所说,从像C / C ++这样的低级语言开始是一个好的开始。 熟悉自己的function,如指针 ,引用,位掩码等,然后尝试组装 。

我真正喜欢的一个教程是在这里find的PC组装教程 (可以在这里findPDF)。 直到你创build并运行一个简单的程序并debugging它,将很难理解程序集。

更重要的是,了解你的冯·诺依曼 计算机体系结构和其他背景信息是非常重要的: 处理器devise , 存储器devise , 总线体系结构 ,各种caching , 二进制数字系统和操作等等。没有一个完整的理解你正在使用的math和你正在编程的硬件,因为在这个级别进行编程时你非常接近硬件。

在许多情况下,在一个更简单的处理器上学习更容易。 我首先学习了一个Java模拟器,该模拟器使用x86指令集的更简单的衍生产品,使用较less的寄存器,然后在Motorola MC68HC12项目板上编程。

就个人而言,我认为在c64或Apple II等复古电脑上使用汇编工作很有趣。 这是关于如同你可以去的那样裸露的骨骼。 一旦你感觉舒服,你应该能够跳到x86组装。

除了上面提到的教程和参考资料之外,我build议首先熟悉C语言,因为Python不会像汇编程序那样大飞跃。 C也尽可能地接近汇编器(在性能和硬件方面),而且学习曲线更less。

一旦你对C熟悉了,就可以对你的体系结构的指令和寄存器有一个基本的了解,然后在一些基本的C应用程序上运行一个debugging器(Linux上的GDB和Windows上的WinDbg或者OllyDebug)来看看它们在这个层次上的运行情况。

你从编译器中提到的好处是有点真实的,但是在C语言中你会遇到很less的痛苦。就像大多数情况一样,如果你在汇编中编码严重(没有冒犯性,但你可能会成为初学者)将运行比写得很好的C应用程序慢。

而且,你总是可以用C语言内联程序集 。

我参加了我们大学编写MIPS汇编的课程。 这是一个RISC处理器,这使人类的努力更人性化。 而且,要说的真相,一旦你掌握了它的真相,那就很有趣,而不是那么困难。

不幸的是,我不记得我们在那个课程中使用的书籍,但我相信亚马逊有一些很好的build议。

尝试SPIM作为模拟平台。

Daniel Auger是对的。

根据你的倾向,find一个CP / M Z80模拟器或6502苹果模拟器是一个很好的select。

“回到当天”我们都学会了汇编,因为它实际上是一种实用的语言。 没有caching,没有预测性的执行等。你有一些寄存器,几十条指令等等。一个大的程序(按我的标准!)是8或10千字节。

正如其他人所说,从像C / C ++这样的低级语言开始是一个好的开始。 熟悉自己的function,如指针,引用,位掩码等,然后尝试组装。

这应该是第一步。 之后,您可以使用书写伟大的代码,第2卷:低层次思维,写作高层次的书 。 它显示了编译器如何将高级代码转换为汇编。

MIPS,MIPS,MIPS,MIPS,MIPS。 这就是我说的。

MIPS是我认为最简单,最干净,最优雅的指令集。 这基本上是“原来的RISC”。 如果你有一个基于MIPS的路由器或者其他可破解的设备,请为它写一些代码。

另一个非常干净甚至更简单的架构是AVR ,它是Atmel微控制器中使用的8位架构。 非常正交和简单的学习和使用。

显然,如果你需要在汇编中做一些特定的工作(如优化时间关键代码),请学习汇编语言,无论你使用的是什么架构…最有可能的x86。 x86汇编function强大,但相当混乱。

@Chris Fournier就如何学习Assembly提供了一个很好的答案。 我不能提供更好的,他已经做了,但更多的参考:

  • assembly艺术 – 这是一个学习assembly的很好的资源
  • 史蒂夫·吉布森 – 这个人有assembly技能。 他只是在Assembly里写了自己的工具SpinRite 。 这是他推荐的一些资源的链接,也是他在汇编中写的一些示例程序。

学习如何在C语言编程是一个好主意,因为C是最低级别的高级编程语言,但是如果您想先学习硬件,我build议您阅读本书:“完整的PC硬件说明指南”。

而学习使用汇编语言进行编程,我build议你从具有16位寄存器的8086架构开始,让你更好地理解计算机如何处理数据。 “汇编语言艺术”就是这方面的一本好书。