创建ARM Dissassembler需要有关MUL指令(ARM组装)的帮助

时间:2013-03-25 02:25:37

标签: assembly arm multiplying

我正在尝试为ARM创建一个反汇编程序,因为我想学习ARM汇编语言。我从另一个StackOverflow线程中读到,这是最好的方法。所以我遇到的一件事就是正确解码乘法。

以下是反汇编对象文件的示例。

00008054< _start>:  ==============省略无关的指示====

8064:   e0010092    mul r1, r2, r0

从参考手册(http://www.nyx.net/~troddis/ARM.html)中,乘法指令的位[4-7]的值应为“1001”。但是,二进制的e0010092是“11100010000000000001000000000010”,其中有0000位4-7。

有什么明显的东西让我失踪吗?我正在使用CodeSourcery的ARM 2012.09-64交叉编译器......

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果你记得的话,将十六进制转换为二进制可以在很大程度上完成“在你脑中”:

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

上面一行是2的幂,它构成一个十六进制数字 - 8+4+2+1 == 0xf。下面的线是一些任意二进制;要将其转换为十六进制,请在4位二进制数字单位(“半字节”),第三行中添加两个幂集。每个半字节都是一个十六进制数字。所以每个半字节都这样做,你就得到了二进制的十六进制。在上面的情况下,8+2+1 == 0xb8+1==9所以你有10111001 == 0xB9(假设你把第0位算作最右边的那个;如果你认为最左边的那个是零,那就是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

默认的“base”为10,因此如果您要转换为10,则无需明确指定输入/输出数字库。网络上有bc的介绍;比如this one