【发布时间】:2013-03-25 02:25:36
【问题描述】:
我正在尝试为 ARM 创建一个反汇编程序,因为我想学习 ARM 汇编语言。我从另一个 StackOverflow 线程中读到这是最好的方法。所以我遇到的一件事是正确解码乘法。
这是一个反汇编目标文件的示例。
00008054 <_>: ==============省略不相关的指令====
8064: e0010092 mul r1, r2, r0
根据参考手册 (http://www.nyx.net/~troddis/ARM.html),乘法指令在位 [4-7](含)中的值应为“1001”。但是,二进制中的 e0010092 是“111000100000000000001000000000010”,其中第 4-7 位为 0000。
我有什么明显的遗漏吗?我正在使用 CodeSourcery 的 ARM 2012.09-64 交叉编译器...
【问题讨论】:
-
“我正在尝试为 ARM 创建一个反汇编程序,因为我想学习 ARM 汇编语言。我从另一个 StackOverflow 线程中了解到这是最好的方法。” i> 完全错误。要学习 ARM 汇编,请编写汇编程序(就像任何其他(编程)语言一样)。
-
@m0skit0 +1 是的。我想知道是什么线程给了 OP 那个愚蠢的想法?我想知道,所以我可以否决它,好吧,疯了。
-
为给定 CPU 学习汇编的一种直接方法是让编译器将具有明确定义/约束行为的小型 C sn-ps “音译”为目标代码,然后反汇编结果。这对初学者的好处是双重的:a)反汇编不会被“元数据”弄乱(因为编译器创建的 asm 源是 - 标签,指令,cmets,......),和 b)不像 asm来源,反汇编也显示指令操作码字节。也就是说,这种熟悉 asm 的方法并没有强制要求/您编写自己的反汇编程序也无济于事。
-
实际上知道操作码真的没用(除了非常具体的主题)。无论如何,您将无法记住这一点。了解操作码是如何以及它们是如何从汇编指令生成的可能是值得的,但它仍然远不如了解指令实际执行的操作以及如何使用该汇编编写正确的程序重要。
-
大家好,感谢 cmets。这是线程:stackoverflow.com/questions/270078/… 并且获得第二高票的答案之一(我认为)提倡这一点。那么我应该继续我的任务吗?
标签: assembly arm multiplication