0

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

这是一个反汇编的目标文件的示例。

00008054 <_start>:==============省略不相关的指令====

8064:   e0010092    mul r1, r2, r0

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

我有什么明显的遗漏吗?我正在使用 CodeSourcery 的 ARM 2012.09-64 交叉编译器...

4

2 回答 2

2

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

于 2013-03-25T02:29:24.570 回答
0

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

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

上面一行是构成十六进制数字的 2 的幂 - 8+4+2+1 == 0xf。下面的行是一些任意二进制;要将其转换为十六进制,请在第三行添加 4 位二进制单位(“半字节”)中设置的 2 的幂。每个半字节都是一个十六进制数字。所以对每一个半字节都这样做,你就得到了二进制的十六进制。在上面的情况下,8+2+1 == 0xb所以8+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*Xbc对各种数字转换都有帮助:

$ 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网上都有介绍;喜欢这个

于 2013-03-29T08:09:55.787 回答