Assembly 学习汇编语言的先决条件

Assembly 学习汇编语言的先决条件,assembly,prerequisites,Assembly,Prerequisites,我决定学习汇编语言,因为我知道学习汇编语言有很多好处,我们可以直接与硬件交互,我们可以更好地学习计算机,等等。当我第一次开始学习它的时候,我知道它有点奇怪,不像其他编程语言,所以我想也许我会发现学习起来很难。所以,我只是问学习汇编语言的基本前提是什么。对于信息,我已经学习了C、C++、C、P等编程语言。 < P>汇编不同于你已经学习过的任何高级语言。p> x86寄存器是一个很好的起点,下面是我找到的一个解释它们的网站: 祝你好运 编辑: 另外,开始并坚持使用某种汇编语言总是很好的,例如我开始使

我决定学习汇编语言,因为我知道学习汇编语言有很多好处,我们可以直接与硬件交互,我们可以更好地学习计算机,等等。当我第一次开始学习它的时候,我知道它有点奇怪,不像其他编程语言,所以我想也许我会发现学习起来很难。所以,我只是问学习汇编语言的基本前提是什么。对于信息,我已经学习了C、C++、C、P等编程语言。

< P>汇编不同于你已经学习过的任何高级语言。p> x86寄存器是一个很好的起点,下面是我找到的一个解释它们的网站:

祝你好运

编辑:


另外,开始并坚持使用某种汇编语言总是很好的,例如我开始使用的,它有一个相当大的社区,有一些很酷的功能,如符号管理和名称空间。

一台计算机,一个汇编程序,一本描述所讨论的汇编语言的书。由于您了解C,一些C编译器甚至允许您在C和C之间编写程序集。

您必须告诉我们您想学习哪台机器的程序集
ARM
x86(_64)
Sparc
等都是不同的ISA

如果您只是想了解汇编编程的一般情况,那么这是一个很好的方法(尽管您编写的不是汇编,而是高级语言和低级语言的混合,它会很好地向您介绍这个概念)

如果您已经将目光投向了x86,我可以推荐这本书:。除了那本书之外,它还是一个很好的资源

对于
x86
,环境的选择也很重要。是一个伟大的教程为Windows汇编编程由伊利诺伊大学UrrasaPangaPang-ACM学生章-SigWindows。对于Unix,我遇到的一个很棒的教程是。丹尼斯·尤里切夫(Dennis Yurichev)提供了一个很棒的、更通用的资源。这本书的目标是windows和unix环境,尽管它涉及逆向工程,但它可以帮助您了解大量计算机上运行的程序的设计


对于
ARM
,这是一个很好的介绍

我大约两个月前开始在assembly中编程,到目前为止进展顺利。让我总结一下我到目前为止学到的东西

语法

x86汇编有两种主要语法:Intel和AT&T。每种语法都有其优缺点。Intel语法似乎仅用于基于x86的处理器,而AT&T语法用于几种不同的体系结构(例如ARM)。如果您查看源代码,您将看到他们对几种不同的体系结构使用at&T语法。然而,许多人认为英特尔语法更具可读性。到目前为止,我一直在使用英特尔语法编程,但我知道如何阅读AT&T语法的大部分内容

汇编程序

您可以将内联汇编与GCC一起使用,但不能与MSVC 64位一起使用。到目前为止,我还没有使用内联汇编。有几种汇编程序可供选择,例如:、和。MASM只使用Intel语法,据我所知,它只真正用于Windows(我认为它不可能是Linux的ELF对象文件)。NASM还仅使用Intel语法,但可以创建多个不同的对象文件,例如Windows和Linux。就我所知,YASM在很大程度上是NASM,但也支持AT&T语法。FASM使用Intel语法,也可以创建多个不同的对象文件,但它在多个方面与NASM和YASM不同。我还没有使用FASM,但它看起来很诱人。GAS使用AT&T语法(尽管可以使用Intel语法),并且实际上是使用GCC编译时使用的语法。GCC生产的组件被发送到GAS

理解每个汇编器都有其唯一的方言是很重要的,因此您不能期望用MASM编写的代码必须在NASM中进行开箱即用的组装。据我所知,NASM和YASM在很大程度上是兼容的

您应该选择哪个汇编程序?到目前为止,我只使用过NASM

调用约定并与C链接

到目前为止,我学习汇编的最佳来源是GCC。用C编写代码,然后查看程序集。例如,如果您有一个简单的函数
foo
,您可以

gcc -O3 -S foo.c             //AT&T syntax
gcc -O3 -S -masm=intel foo.c //Intel syntax
然后查看文件
foo.s
,也可以使用
objdump

gcc -O3 -c foo.c
objdump -d foo.o             //AT&T syntax
objdump -d -Mintel foo.o     //Intel syntax
你应该知道你的操作系统的功能。32位代码和64位代码的调用约定不同。对于Windows和Linux,它们在32位代码上相同,但在64位代码上不同。到目前为止,我只使用NASM为Linux 64位编写了汇编代码

关于SO的许多汇编问题似乎都是关于在汇编中编写整个函数,包括用户输入和输出。我认为这没有必要。让C负责输入和输出。你可以看到一个例子。我给出了NASM代码和C代码,并解释了如何组装、编译和链接它们。这是我在x86汇编中写的第一件事之一。在那个问题上,我有一个函数

float triad(float *x, float *y, float *z, const int n);
Linux x86-64(或者更确切地说是System V AMD64 ABI)调用约定在
rdi
寄存器中传递第一个参数,在
rsi
中传递第二个参数,在
rdx
中传递第三个参数。所以在这种情况下,
rdi=x,rsi=y,rdx=n

一旦您取消了调用约定,并且可以使用C从程序集接口您的对象文件,您将发现使用程序集要容易得多


最后,我学习汇编的第二个最好的来源是。手册的第一部分为初学者提供了很多好的建议。一旦你有了一些经验,手册的后面部分就会有很多好的信息。

如果你需要的话,你不需要任何先决条件