【问题标题】:Learning Assembly Language [closed]学习汇编语言
【发布时间】:2013-03-10 02:35:42
【问题描述】:

我正在尝试学习汇编语言,但我需要帮助来了解每个命令的用途。以下是使用它们的程序。

 push   %ebp
 mov    %esp,%ebp
 sub    $0x10,%esp
 mov    0x8(%ebp),%eax
 add    $0x1,%eax
 mov    %eax,-0x4(%ebp)
 mov    -0x4(%ebp),%eax
 leave  
 ret

【问题讨论】:

    标签: linux assembly att


    【解决方案1】:

    一个非常基础的汇编语言入门

    首先,您应该知道汇编语言与特定的处理器 (CPU) 或处理器系列相关。例如,问题中显示的 sn-p 似乎适用于 Intel x86 架构。这一点很重要,因为很多汇编语言指令作用于或基于 CPU 寄存器的内容。因此,在深入研究单个指令的细节之前,您应该熟悉 CPU 的架构,即可用寄存器的名称和特征以及它们的作用(其中一些寄存器本质上是通用的,但其他人有非常具体的角色)。架构的一部分也是寻址外部内存位置的方式。

    其次,只有汇编语言指令种类很少

    • 流控制指令(测试、跳转、返回 [从子程序] 等)
    • 数据复制指令(将内存内容移入/移出注册表和/或内存)
    • 堆栈管理指令(这些是一种特殊的数据复制指令,也作用于名为 SP 的堆栈指针,一个特殊寄存器)。
    • 算术指令(加、减、乘等)
    • 布尔运算(移位[寄存器内容]、按位与、按位或等)

    第三,有时会使事情变得更复杂(但也使汇编逻辑非常强大)的是寻址模式。本质上,寻址模式用于确定哪些内存位置将用于给定指令。寻址模式的例子有直接和间接,前者提供直接读/写的地址作为指令的操作数,后者也提供内存地址操作数,但获得用于读/写的有效地址通过首先读取提供的地址的内容并将该内容用作应该进行操作的地址。

    有了上面的基本了解,你大概可以开始进入处理器的说明手册,并更了解这一切。

    可能从以下 Wikipedia 条目开始:

    然后可能是 this 8 pages introductory course notes (pdf) 之类的文档

    最后一句警告:直接查看代码并试图弄清楚它的作用是理解汇编语言的一种非常有效的方法。但是我注意到您的原始帖子(在 pastebin 上)提到了反汇编程序;请注意,有时反汇编程序可能会感到困惑(例如,当它们处理包含代码的数据区域时)并产生非常不明智的指令列表。另外,通过阅读真实的源代码(而不是通过反汇编产生的源代码),您将从作者的评论和良好的标签名称中受益,这对理解逻辑很有帮助。

    【讨论】:

      【解决方案2】:

      这是一本非常适合你的书:

      Computer Systems: A Programmer's Perspective

      【讨论】:

        【解决方案3】:

        只需快速搜索即可获得以下 x86 汇编语言参考

        为什么要学习汇编语言是另一回事!

        【讨论】: