【问题标题】:Creating an ARM Dissassembler Need help on MUL Instruction (ARM Assembly)创建 ARM 反汇编程序 需要有关 MUL 指令的帮助(ARM 汇编)
【发布时间】: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


【解决方案1】:

你是怎么把它转换成二进制的?十六进制 9 正好是二进制 1001。

【讨论】:

  • 哎呀。我的错。现在觉得自己好傻。我使用了 ruby​​ 的转换,由于某种原因它弄乱了值。有没有办法删除这个问题?
【解决方案2】:

如果您还记得的话,将十六进制转换为二进制基本上可以“在您的脑海中”完成:

8421|8421...
===========
1011|1001...
8 21|8  1...

上面一行是组成十六进制数字的两个的幂 - 8+4+2+1 == 0xf。下面一行是任意二进制;要将其转换为十六进制,请在第三行添加 4 位二进制单位(“半字节”)中设置的 2 的幂。每个半字节都是一个十六进制数字。所以对每一个半字节都这样做,你就得到了二进制的十六进制。在上面的情况下,8+2+1 == 0xb8+1==9 所以你有10111001 == 0xB9(假设你把零位算作最右边的一位;如果你认为零位是最左边的一位,那就是0x9B,欢迎来到字节序的世界......但这是另一个问题)

反过来也很简单;你的号码:

e   |0   |0   |1   |0   |0   |9   |2   |
842 |    |    |   1|    |    |8  1|  2 |
1110|0000|0000|0001|0000|0000|1001|0010|

同样,最上面一行是十六进制数字,中间一行是 2 的幂求和得到十六进制数字,下面是位序列。

我倾向于使用计算器将十进制转换为十六进制,反之亦然,但是二进制转换/从十六进制,按照上面的方法在我的脑海中进行。

如果你真的想使用计算器,UN*X bc 对各种数字转换都有帮助:

$ echo "ibase=16;obase=2;B8F7D335" | bc
10111000111101111101001100110101
$ echo "ibase=16;B8F7D335" | bc
3103249205
$ echo "obase=16;ibase=2;10111000111101111101001100110101" | bc
B8F7D335

默认的“基数”为 10,因此如果您要转换为/从 10 转换,则无需明确指定输入/输出数基数。 bc的介绍遍布网络;喜欢this one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2022-08-11
    • 2011-02-18
    • 2023-03-10
    • 2011-03-25
    相关资源
    最近更新 更多