19

有没有人有关于学习 Linux x86-64 汇编基础知识的文档?我不确定是按原样学习,还是先学习 x86,然后再学习,但是由于我有一台 x86-64 计算机而不是 x86,所以我正在考虑改为学习 x86-64; )

也许有人可以给我一些激励和指导,让我了解什么、如何以及使用什么文档。

请给我你最喜欢的文档标题,我编写了一点 Python,这是我第一次尝试使用较低级别的语言,我已经准备好投入它了。

谢谢大家

4

3 回答 3

24

一般建议:

它不仅仅是“x86 汇编程序”。每个汇编器都有点不同,它们通常彼此不兼容。我推荐 NASM 汇编器,因为它使用广泛,易于安装,并且支持 64 位汇编。

阅读一本关于 x86 汇编器的好书,以了解基础知识(寄存器、条件跳转、算术等)。刚开始的时候,我读了 Randall Hyde的 Art of Assembly 。

http://asm.sourceforge.net看起来有一些不错的教程,您可能想学习这些教程。但是如果您在 64 位模式下进行汇编,请注意 C 函数和系统调用的调用约定是不同的。

您将需要 CPU 参考手册。就个人而言,我更喜欢AMD的。您需要 CPU 手册的第 1 卷和第 3 卷。其他卷可能也很有趣。

64位具体建议

64 位 x86 程序集与 32 位 x86 程序集几乎相同,因为 64 位 x86 大多向后兼容 32 位。您可以访问 64 位寄存器和其他一些功能,一些晦涩的指令不再有效,其余的与 32 位相同。

但是,系统调用约定在 64 位 Linux 上完全不同。根据您的内核,32 位系统调用可能可用也可能不可用。更糟糕的是 64 位调用约定的文档很少。我只是通过检查 glibc 源代码的深度才弄明白的。

为了省去您很难找到这个问题的麻烦,系统调用号位于 Linux 源代码中的arch/x86/include/asm/unistd_64.h. 系统调用号在rax寄存器中传递。参数在rdi, rsi, rdx, r10, r8, r9. syscall使用指令调用调用。syscall覆盖rcx寄存器。回报在rax. (可以在此处找到一个简短的示例。)

于 2009-11-29T03:32:47.860 回答
2

看看这里,它是 Linux Assembly 开发的最佳场所,您会找到资源、文档和链接。

于 2009-10-16T01:25:40.913 回答
1

对 x86的规范参考可能是Intel® 64 and IA-32 Architectures Software Developer's Manual。我还有几卷这个系列,从 P III是新的时候开始的。还有一本AMD64 Architecture Programmer's Manual,这可能很有趣,因为 Intel 在 x86-64 设计方面没有完全追随 AMD 的领先地位,但我还没有读过。

X86 操作码和指令参考与宣传的完全一样:x86(-64) 操作码和指令,仅此而已。如果您想快速搜索某些特定指令,则非常方便。

于 2009-10-16T01:25:55.443 回答