使用树莓派学习汇编语言?

14

我查了一些资料但没有找到关于这个问题的明确答案,所以我希望能听听您的意见。

我想学习汇编语言(ARM)- 树莓派是一个好的选择吗?

从我所看到的情况来看,似乎有一些适合新手的教程,例如制作 LED 闪烁等,因此从新手角度来看,它并不太可怕,实际上看起来非常有趣。

如果我从树莓派开始,然后转向使用反汇编器来增加知识,那么我的学习路径是否正确呢?

感谢您的评论。


Vivek-Ramachandran - SecurityTube 这只是第一个视频...你可以在security-freak.in上找到其余的连续视频。 - Grijesh Chauhan
本网站是为您遇到的具体编程问题而设立的,而非为获取有关教育方面的一般建议。 - Bo Persson
1个回答

23

是和不是。如果这是你第一次学习汇编语言,ARM(x86是不好的)是一个不错的选择,也有其他不错的选择。我建议使用指令集模拟器来进行学习。这可以让你更好地了解正在发生的事情,并增加成功的机会(减少因挫折而放弃的机会)。一旦你熟悉了工具、构建裸机程序等方面的基础知识,树莓派就是一个不错的平台。尽管外围设备文档记录不佳,但它们比其他类似的平台更容易使用,而且有足够的社区和示例来弥补文档的不足。从ARM的角度来看,树莓派可以被认为是不可砖化的。在尝试制作你的第一个闪烁LED程序时将板砖化可能会非常令人沮丧。

我非常赞成编写反汇编器作为学习新指令集的方式。ARM指令集是固定字长(32位)且非常容易反汇编。纯Thumb指令则固定为16位,更容易反汇编。但Thumb有Thumb2扩展,这使得它更难以处理,因此我建议一开始避免使用这些扩展。对于固定字长指令集,你可以安全地从头到尾遍历二进制映像并进行反汇编。数据会看起来很奇怪,但指令将在正确的位置。对于可变字长,则不能简单地从开头开始线性反汇编(使用Thumb2扩展意味着可变指令长度)。你可能会有一个三字节的指令,然后是一个字节的数据,然后又是另一个字节的指令,线性地反汇编该数据字节将被反汇编为指令,如果恰好解码为多字节指令,则现在就不同步了。反汇编可变指令长度的二进制文件的唯一正确方法是按执行顺序跟踪代码的所有路径,并从中反汇编出您可以的内容(无需模拟每个可能的代码路径,您可能无法区分所有指令和数据)。可变指令长度的反汇编绝对是一个高级主题,在着手处理反汇编器之前,先要学习一些汇编语言,甚至可以为可变字长指令集创建一个指令集模拟器(您基本上需要逐步解码二进制文件,但不是完全解码,而是部分解码)。对于 Thumbulator 和 Amber_samples 的方法都是固定指令长度,易于查看汇编到机器代码到汇编的关系,以及查看您的代码运行并了解为什么会出现错误(在树莓派或其他硬件上可能看不到这些错误)。有一个剑桥大学的例子可以通过简单的LED闪烁示例手把手地进行,并进入视频像素。还有其他人在讨论区的裸机部分发布了他们的示例链接。要了解“如何使用汇编语言”,请编写小型C函数,进行编译(带有优化),然后进行反汇编。我特别是指像a + b这样的代码,而不是printf()之类的代码。首先要学习汇编语言和指令集,这是针对处理器系列的特定(常见)指令集。然后我认为应该在此之后学习系统调用或库调用。“如何打印字符串”之类的东西涉及硬件学习,系统(rom监视器/调试器)或库(C库或其他高级语言函数调用和约定利用它们的库,这些库本身可能调用许多其他库,导致连接了很多垃圾)。因此,使用C语言来学习“汇编语言”意味着没有库调用,没有memcpy、没有printf等。但这取决于你,如果你使用系统和库调用,则必须编写你的asm代码以在该系统上运行或与那些调用链接,这些调用本身可能具有系统依赖性。想想学习高级语言C或Python等的方式。需要学习语言,声明变量学习加,减,异或等运算符。如何使用指针和数组等。最终你会学习C库调用,如printf()、strcpy()、malloc等。结果因人而异,可以分别学习语言和系统调用,也可以通过学习与系统调用进行接口来学习语言(一起学习)。
如果选择将asm作为系统的一部分进行学习,则建议留在Linux中,创建数个简单的C函数,编译并反汇编,学习编译器的调用约定,并使用ARM参考资料查找由编译器创建的指令。学习使用ASM从头开始创建该函数,并将其链接到C程序中,然后修改该函数。这是与上述完全不同的方法,可能会失败,但肯定是一个通过示例学习的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接