文章摘要
作者回顾了自己在大学学习x86汇编语言的经历,指出当时所学内容已过时,涉及DOS、实模式、内存分段等老旧概念。尽管后来通过自学能够理解编译器输出的汇编代码,但从未手动编写过大量x86汇编代码。由于全球疫情隔离在家,作者决定深入学习x86-64汇编语言,并跳过所有不再相关的遗留内容。在深入研究后,作者决定将学习笔记以教程形式发布在博客上,以满足对此类内容的需求。
文章总结
文章总结:学习x86-64汇编语言!第0部分 - 设置与第一步

本文是x86-64汇编语言系列教程的第一部分,作者分享了如何从零开始学习x86-64汇编语言,并详细介绍了所需的工具和基本概念。文章主要分为以下几个部分:
1. 背景与动机
作者提到自己在大学时期学习的x86汇编语言已经过时,尤其是在64位处理器逐渐普及的背景下,课程仍然停留在DOS和实模式等老旧技术。尽管如此,作者通过自学掌握了汇编语言,并决定在疫情期间通过编写x86-64汇编程序来打发时间。为了帮助其他有相同需求的人,作者决定将学习笔记整理成教程发布。
2. 工具准备
为了编写和调试x86-64汇编程序,作者推荐了两个主要工具: - 汇编器(Assembler):作者选择了Flat Assembler(FASM),因为它小巧、易用,并且支持宏系统。 - 调试器(Debugger):作者推荐使用WinDbg,因为它适合查看反汇编、内存和寄存器状态。
3. 汇编语言的基本概念
作者简要介绍了汇编语言的核心概念: - 指令集(Instruction Set):CPU只能执行固定数量的简单指令,如将数据写入内存或进行算术运算。 - 寄存器(Registers):x86-64架构有16个通用寄存器,每个寄存器为64位宽,且可以单独访问其低字节、字和双字部分。 - 内存与地址(Memory and Addresses):内存可以看作是一个字节数组,每个字节都有一个唯一的地址。现代操作系统通过虚拟内存机制为每个进程提供独立的地址空间。
4. 第一个汇编程序
作者编写了一个简单的x86-64汇编程序,程序加载后立即退出。代码分析如下:
- format PE64 NX GUI 6.0:指定生成的二进制文件格式为Windows的PE格式。
- entry start:定义程序的入口点为start标签。
- int3:触发调试断点,方便调试器暂停程序。
- ret:返回操作系统,结束程序。
5. 使用调试器
作者详细介绍了如何使用WinDbg调试汇编程序,包括如何查看反汇编代码、寄存器状态、内存内容和调用栈。通过单步执行,读者可以观察程序的实际运行过程。
6. PE文件格式与DLL导入
为了调用Windows API函数(如ExitProcess),作者介绍了PE文件格式的基本结构,特别是.idata节,它包含了程序导入的DLL和函数信息。通过FASM的指令,作者展示了如何定义导入表。
7. 64位Windows调用约定
作者解释了64位Windows的调用约定,重点包括:
- 前四个整数参数通过rcx、rdx、r8和r9寄存器传递。
- 调用者需要为前四个参数分配32字节的“影子空间”。
- 调用者负责清理栈空间。
8. 调用ExitProcess
最后,作者展示了如何通过汇编代码调用ExitProcess函数,并详细解释了每一步的操作,包括调整栈指针、设置参数寄存器以及通过导入表调用函数。

总结
本文为x86-64汇编语言的入门教程,涵盖了工具准备、基本概念、第一个程序的编写与调试,以及如何调用Windows API函数。作者计划在后续教程中进一步探讨更复杂的汇编编程技巧。
Like this post? Follow me on bluesky for more!
评论总结
学习汇编语言的热情与资源分享
- 评论1的作者表示虽然自己不懂汇编语言,但发现手写汇编非常适合即将开发的应用,因此开始积极学习,并分享了一些学习资源。
- 关键引用:
- "But hand written asm as a feature fits perfectly into my upcoming app, so now I am on a roll learning assembly!"
- "手写汇编功能非常适合我即将开发的应用,因此我现在正在积极学习汇编!"
- "Here are some more resources I found so far:"
- "以下是我目前找到的一些资源:"
对现代ARM汇编资源的渴望
- 评论2的作者希望有更多关于现代ARM汇编的文章和资源,尽管他从未编写过汇编代码,但对学习相关内容感兴趣,并认为Intel的汇编语言显得过时。
- 关键引用:
- "I wish there were more articles and resources about modern ARM assembly."
- "我希望有更多关于现代ARM汇编的文章和资源。"
- "Intelisms feel so archaic and crusty in comparison."
- "相比之下,Intel的汇编语言显得过时和陈旧。"
汇编指令的全面概述
- 评论3的作者推荐了AsmGrid,认为它对X86和AArch64指令有很好的概述。
- 关键引用:
- "I think AsmGrid has a great overview of X86 and AArch64 instructions."
- "我认为AsmGrid对X86和AArch64指令有很好的概述。"
汇编语言系列文章的更新计划
- 评论5的作者表示系列文章的最后一篇仍在草稿中,原本计划讨论流程控制指令,但内容扩展到了重定位、位置无关代码和ASLR等话题,未来会整理发布。
- 关键引用:
- "The final part of this series is still sitting in my drafts."
- "这个系列的最后一篇仍在草稿中。"
- "It spiralled and ended up touching on relocations, position-independent code, aslr..."
- "内容扩展到了重定位、位置无关代码和ASLR等话题……"
汇编语言细节的讨论
- 评论6的作者对汇编语言中的寄存器命名提出了疑问,询问是否应为“ax, bx, cx, dx”而非“ah, bh, ch, dh”。
- 关键引用:
- "Did you mean 'ax, bx, cx, dx'?"
- "你是指'ax, bx, cx, dx'吗?"
总结:评论中主要围绕汇编语言的学习、资源分享、对现代ARM汇编的渴望以及对汇编指令的讨论展开。部分评论者分享了学习资源,表达了对汇编语言的兴趣,并对相关技术细节进行了探讨。