Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 学习汇编语言_Linux_Assembly_Att - Fatal编程技术网

Linux 学习汇编语言

Linux 学习汇编语言,linux,assembly,att,Linux,Assembly,Att,我正在尝试学习汇编语言,但我需要帮助学习每个命令的用途。下面是使用它们的程序 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 这是一本非常适合你的书: 只需快速搜索一下,就可以得到以下x86汇编语言的参考 你为什么想学汇编语言是另

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

 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

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


只需快速搜索一下,就可以得到以下x86汇编语言的参考


你为什么想学汇编语言是另一回事

一本非常基础的汇编语言入门读物

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

其次,汇编语言指令的种类很少:

  • 流量控制指令(测试、跳转、返回[来自子程序]等)
  • 数据复制说明(将内存内容移动到注册表和/或内存中/从注册表和/或内存中移动)
  • 堆栈管理指令(这是一种特殊的数据复制指令,也作用于名为SP的堆栈指针,一个特殊寄存器)
  • 算术指令(加、减、乘等)
  • 布尔运算(移位[寄存器内容]、位and、位or等)
第三,有时会使事情变得更复杂(但也使汇编逻辑变得非常强大)的是寻址模式。基本上,寻址模式用于确定给定指令将使用的内存位置。寻址模式的示例包括直接寻址和间接寻址,前者提供直接读/写的地址作为指令的操作数,后者也提供内存地址操作数,但用于读/写的有效地址是通过首先读取所提供地址的内容并将该内容用作操作应该发生的地址来获得的

有了以上的基本理解,您就可以开始阅读处理器的说明手册,并对其进行更深入的了解

可以从以下维基百科条目开始:

然后可能是像(pdf)这样的文档

最后一点要注意的是:直接查看代码并尝试了解它的功能是理解汇编语言的一种非常有效的方法。然而,我注意到你最初的帖子(在pastebin上)提到了一个反汇编程序;请注意,有时反汇编程序可能会混淆(例如,当它们处理数据区域时,就像它们包含代码一样),并生成非常不合理的指令列表。此外,通过阅读真实的源代码(而不是通过反汇编生成的源代码),您可以从作者的注释和良好的标签名称中获益,这些都有助于理解逻辑