Hacker News 中文摘要

RSS订阅

让我们学习x86-64汇编语言(2020) -- Let's Learn x86-64 Assembly (2020)

文章摘要

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

文章总结

文章总结:学习x86-64汇编语言!第0部分 - 设置与第一步

Image 1

本文是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的调用约定,重点包括: - 前四个整数参数通过rcxrdxr8r9寄存器传递。 - 调用者需要为前四个参数分配32字节的“影子空间”。 - 调用者负责清理栈空间。

8. 调用ExitProcess

最后,作者展示了如何通过汇编代码调用ExitProcess函数,并详细解释了每一步的操作,包括调整栈指针、设置参数寄存器以及通过导入表调用函数。

Image 6

总结

本文为x86-64汇编语言的入门教程,涵盖了工具准备、基本概念、第一个程序的编写与调试,以及如何调用Windows API函数。作者计划在后续教程中进一步探讨更复杂的汇编编程技巧。


Like this post? Follow me on bluesky for more!

评论总结

  1. 学习汇编语言的热情与资源分享

    • 评论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:"
      • "以下是我目前找到的一些资源:"
  2. 对现代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. 汇编指令的全面概述

    • 评论3的作者推荐了AsmGrid,认为它对X86和AArch64指令有很好的概述。
    • 关键引用:
      • "I think AsmGrid has a great overview of X86 and AArch64 instructions."
      • "我认为AsmGrid对X86和AArch64指令有很好的概述。"
  4. 汇编语言系列文章的更新计划

    • 评论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等话题……"
  5. 汇编语言细节的讨论

    • 评论6的作者对汇编语言中的寄存器命名提出了疑问,询问是否应为“ax, bx, cx, dx”而非“ah, bh, ch, dh”。
    • 关键引用:
      • "Did you mean 'ax, bx, cx, dx'?"
      • "你是指'ax, bx, cx, dx'吗?"

总结:评论中主要围绕汇编语言的学习、资源分享、对现代ARM汇编的渴望以及对汇编指令的讨论展开。部分评论者分享了学习资源,表达了对汇编语言的兴趣,并对相关技术细节进行了探讨。