使用Raspberry Pi学习汇编语言?

时间:2012-12-01 18:04:23

标签: assembly arm raspberry-pi

我做了一些搜索,但未找到明确的答案,所以我希望我能得到你的意见。

我想学习汇编语言(ARM) - Raspberry Pi会不会是一个很好的选择?

从我所看到的,似乎有一些温和的教程可用于制作LED闪光灯等等,所以从新手的角度来看它并不太可怕,而且它实际上看起来很有趣。

如果我从Raspberry Pi开始,然后继续使用反汇编程序来建立我的知识,我是在一条好路上还是我开始走错了路?

感谢您的评论。

1 个答案:

答案 0 :(得分:19)

是和否。如果这是你的第一个汇编语言,那么ARM是一个很好的(x86是一个糟糕的汇编语言)(还有其他好的)。我建议先使用指令集模拟器进行学习。这可以让您更好地了解正在发生的事情,并为您提供更好的成功机会(由于受挫而减少放弃的可能性)。一旦你弄湿了工具,建立裸机程序等,那么树莓派并不是一个糟糕的平台。外围设备虽然文档记录很少,但使用起来非常简单(与其他类似平台相比),有足够的社区和示例来补偿文档。从ARM的角度来看,树莓派可以被认为是不可砌筑的。试图制作你的第一个闪烁的led计划的董事会可能会非常令人沮丧。

我非常相信编写反汇编程序是学习新(对我)指令集的一种方法。 ARM指令集是固定字长(32位),非常容易拆解。纯拇指指令固定在16位,甚至更容易拆卸。拇指虽然有拇指2扩展,但这使得它更难,所以我最初会避免使用它们。使用固定字长指令集,您可以安全地浏览二进制图像并从头到尾进行反汇编。数据看起来很奇怪,但说明书会在正确的位置。对于可变字长,你不能简单地从头开始并线性拆解(使用thumb2扩展意味着可变指令长度)你可能有一个三字节指令,然后是一个字节的数据,然后是另一个字节的指令,线性地是那个字节的数据将被反汇编为指令,如果它恰好解码为多字节指令,那么现在你不同步。反汇编变量指令长度二进制文件的唯一正确方法是遵循执行顺序中代码的所有路径,并从反汇编中得到所能(不模仿每个可能的代码路径,您可能无法区分所有指令与数据) 。变量指令长度反汇编绝对是一个高级主题,首先在汇编语言中获得一些优势。甚至可能在处理反汇编程序之前为可变字长指令集创建一个指令集模拟器(你必须基本上解码你通过二进制文件的方式,不是完全解码而是部分解码,以便为可变字长指令集制作反汇编程序。对那里的长篇描述感到抱歉。

thumbifier和amber_samples方法都是固定的指令长度,这使得很容易看到asm到机器代码到asm的关系。以及看到你的代码运行并理解为什么它进入杂草并死亡(你不会在覆盆子pi或任何其他硬件上看到)。

有一个cambride大学的例子,通过简单的闪烁led示例然后进入视频像素。以及其他在论坛的裸机部分发布了他们的示例链接的人。感受"我如何用汇编语言做到这一点"编写小C函数,编译(优化)然后反汇编。我特别谈论像a + b这样的代码,而不是像printf()这样的代码。学习汇编语言,指令集,它是处理器系列的特定(通用)。然后我会争论学习系统调用或库调用之后。 "如何打印字符串"一种东西涉及硬件学习,系统(一个rom监视器/调试器)或库(C库或其他更高级别的语言函数调用和约定,以利用他们的库,它们本身可以调用许多其他库导致大量垃圾链接在)。所以用C来学习汇编语言"这意味着没有库调用,没有memcpy没有printf等等。这取决于你,如果你使用系统和库调用,那么你必须编写你的asm代码在该系统上运行或链接那些本身可能有系统的调用依赖。考虑学习高级语言C或Python等,学习语言,声明变量学习运算符的add,subtract,xor等。如何使用指针和数组等。在某些时候你学习C库调用,printf(),strcpy(),malloc等.YMMV,然后学习语言,然后系统单独调用或学习语言通过学习与系统调用接口(一起学习它们)。

如果您选择学习asm作为系统的一部分,那么我建议保留在linux中,创建一些简单的C函数,编译和反汇编,学习编译器的调用约定并使用arm参考资料查找指令正如你看到它们由编译器创建的那样。学习使用asm从头开始创建该函数并将其与C程序链接,然后修改该函数。这是一种完全不同于我上面描述的方法。有失败的可能性,但绝对是一个通过实例的方法。