汇编语言的哪种语法和架构最有用?

25

我一直想学习汇编语言,但是似乎有很多与汇编相关的信息难以理解。我无法只通过谷歌搜索"学习汇编"就能开始。

首先,有两种语法:Intel和AT&T。它们有什么区别?为什么现在还有两种在使用?我何时需要使用其中之一?

其次,市面上有许多芯片。Intel vs AMD、32位 vs 64位、x86 vs 其他架构... 即使x86本身也是一个完整的芯片家族。那么,我怎样才能知道我从某个网页学到的汇编是否适用于我的机器呢?

甚至还有更多变量(操作系统在确定代码运行方式方面也发挥着作用)。

那么,最大的问题是,在所有这些变量中,我怎么知道应该学习哪种类型?什么是最常见的?人们如何在存在所有这些变化的情况下“了解汇编”?


3
建议您学习适用于您的 CPU 的汇编语言,这样您就可以进行练习;因此首先要知道自己的 CPU 类型。完成后,您可能会发现有多个汇编器可为您的 CPU 编写汇编代码;然后选择汇编器的方式与选择编译器类似。 - ChrisW
汇编语言是一件有趣的事情:从概念上讲,它很容易学习,因为大多数指令非常容易理解。诀窍在于将所有内容组合在一起,并使所有代码路径正常工作。在编写汇编代码时,您学会了要非常小心,因为调试它需要大量的努力。 - doug65536
了解汇编语言就是了解如何编写循环、if语句等等。这在所有汇编语言中都是相同的(几乎相同),就像在所有高级语言中一样(但是与汇编到高级语言不同)。特定版本的汇编需要手册才能正确使用! - dave
11个回答

14

首先,汇编语言有两种语法:Intel和AT&T。它们的区别是什么?

主要差异在表面上:例如,操作数颠倒。

为什么还会使用这两种语法?我应该何时使用其中之一?

Intel使用的语法与几乎所有其他处理器ISA文档使用的语法有很大的不同。

GNU as 在所有平台上都使用AT&T语法,并支持x86和x86_64的Intel语法。

其他汇编器(如NASM、MASM等)仅使用Intel语法。

那么,我怎样才能知道我正在从某个网页学习的汇编语言是否适用于我的机器?

这些信息在IntelAMD的处理器手册中有详细说明。Sandpile也是一个很好的资源。

那么,重要的问题是,考虑到所有这些变量,我应该学习哪种类型的汇编语言?哪种最常见?

最广泛支持的将是奔腾Pro级别的,也被称为“i686”,以及K8级别的(称为“x86_64”或“amd64”或“EM64T”)。从那里开始变化的是是否支持MMX或SSE或其变体。查找CPUID指令 - 它将为您提供正在运行的处理器的支持信息。
“人们如何‘了解汇编’当存在所有这些变体?”我不认为有人“了解”x86。每个需要的人都有处理器手册。

3
ARM 的汇编语法有些类似 x86Intel 语法,目的地在前,寄存器名称没有前缀 %。 我认为 AT&T 和 Intel 语法最重要的区别是,一旦你理解了指令的作用,就不难在任何一种语法中编写或阅读它们。 一旦你同时掌握了两种语法,只需要半分钟的时间在 AT&T 和 Intel 之间进行“上下文切换”。你需要学习的是 x86 ISA;学习语法只是其中的一部分,并且在掌握其中一种语法后,学习另一种语法也很容易。 - Peter Cordes

8

汇编的核心在于你直接使用CPU 的基本指令集来编写代码。由于不同的CPU有不同的指令集,它们各不相同。然而,一旦你掌握了一个“汇编语言”的基本思想,从一个指令集切换到另一个指令集就相对简单。

我建议从 80386 汇编开始学习 - 它被几乎所有你能找到的个人电脑所支持,但没有太多的扩展,不会混淆初学者。


5
你应该学习哪种类型的汇编语言?这取决于你想用它做什么。你是否有兴趣了解更多关于你的PC的信息?你是否对嵌入式编程感兴趣?确保你有一些执行代码的方式。你可能想学习x86系列,但它并不是最容易学习的。很久以前,我认为最容易学习的是Radio Shack Color Computer和他们出售的手册。
最常见的汇编语言取决于你想做什么。通用计算机中有许多基于x86的芯片,但在更专业的角色中,例如智能手机和嵌入式系统中,有更多的芯片。
你不需要学习世界上每种汇编语言才能掌握汇编语言。你可以通过精通一两种语言来了解所有重要的思想,之后主要是学习新的计算机架构。

2
现实情况是,大多数开发人员如今不需要了解汇编语言。但是,了解汇编语言背后的概念(机器结构、寄存器、内存等)是很有用的。为此,学习一种CPU就足够了。
请查看http://www.grc.com/smgassembly.htm - Steve Gibson是少数几个目前积极编写汇编应用程序的开发人员之一,他在其网站上提供了丰富的资源。

2

我发现x86汇编并不像作为第一种汇编语言那样容易学习。MSP430非常容易。世界上的ARM处理器比80x86多,因此这不是一个不好的平台开始学习,并且它很容易学习,除了PC和堆栈之外没有特殊寄存器,所有寄存器都执行相同的任务。我首先学习了lsi/pdp11(不,我还没那么老),它非常简单直接,真的让我学习其他任何东西都变得容易。C语言是从这个汇编语言中衍生出来的。不确定你会在哪里学习,但MSP430离这不远,而且可以使用。

问题在我写完后改变了。最重要的答案是首先学习编程,但我怀疑您已经知道这一点,这与汇编语言无关。其次,通过将编程步骤分解为寄存器加载和存储以及ALU类型操作来学习执行这些编程步骤。理解中断及其影响,中断可以发生在任何两个指令之间,您必须保留机器的状态、寄存器和标志等。有些处理器会为您完成大部分工作,因此您可能需要尝试几种不同的处理器才能了解其复杂性。中断和中断服务例程是高级的,只能将您的任务分解为基于寄存器的小而简单操作通常就可以算作汇编语言编程。


我发现x86汇编语言并不像第五或第六种汇编语言那样容易学习。有一些关于模式的东西让我的大脑不愿意参与进来。 - David Thornley

2

我记得读过一本关于x86汇编的入门书,作者可能是Peter Norton。这本书通过引导初学者创建一个全屏硬盘编辑器来帮助他们学习。这是最好的学习方法,因为你可以获得有关x86架构所涉及的低级硬件的完整体验,并将这些知识应用于其他CPU上。DOS中断的知识不太有用,但仍然很有趣。


您是否有任何链接? - Pacerier

2

我曾经很久以前读过Jeff Duntenmann的优秀著作《汇编语言逐步学》。这可能是我见过的针对初学者的80x86汇编语言唯一的一本书,而且是非常好的一本。其中的许多内容可能有些过时,我想,在现今大多数事情上,在x86上使用汇编语言进行编程已经相当过时了。但是,如果您想入门并建立基础,我认为他的书是您应该去的地方。


2
正如所提到的,找一个支持你的硬件并且你喜欢的汇编器来学习。选择很多,不仅限于英特尔或AMD。许多嵌入式系统使用其他芯片,包括古老的680x0系列。
至于了解所有汇编语言,有人知道所有编程语言吗?有人知道所有的.NET API吗?你非常熟悉任何编程语言的一个小核心部分,还有一些你可以使用但可能不完全理解,而更大的部分你只是略知一二,必须参考手册,还有一些你根本不知道。
即使是古老的6502也有数十个操作数和寻址方法。你学习你需要做的工作。你做的工作越多,你学到的就越多。

1

很难说哪种汇编语言是“最有用”的,除非你选择要使用的平台。

如果你选择PC(intel,amd),那么从x86汇编开始。不同CPU有一个共同的指令集,还有一些特定于技术的指令,如SSE。如果你想开发Windows应用程序,请看看MASM;如果你想开发Unix应用程序,则FASM是一个不错的选择。


1
我也建议查看NASM和GAS以进行跨平台使用。 - bcat

1

你想成为Windows黑客吗?学习x86。你想成为嵌入式工程师吗?去购买一块DSP培训芯片并学习它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接