我正在尝试为ARM创建一个反汇编程序,因为我想学习ARM汇编语言。我从另一个StackOverflow线程上读到,这是最好的方法。所以我遇到的一个问题是如何正确地获得乘法的解码。
下面是一个反汇编对象文件的示例。
00008054 <_start>:==============ommitted无关说明====
8064: e0010092 mul r1, r2, r0
根据参考手册(http://www.nyx.net/~troddis/ARM.html),乘法指令的值应为4-7位中的"1001“。然而,二进制e0010092是"11100010000000000001000000000010“,它在4-7位中具有0000。
我是不是明显漏掉了什么?我使用的是CodeSourcery的ARM 2012.09-64交叉编译器...
发布于 2013-03-25 10:29:25
你是怎么把它转换成二进制的?十六进制9恰好是二进制1001。
发布于 2013-03-29 16:09:56
如果你还记得,十六进制到二进制的转换在很大程度上可以在“你的头脑中”完成:
8421|8421...
===========
1011|1001...
8 21|8 1...
上面一行是组成十六进制数字8+4+2+1 == 0xf
的2的幂。下面一行是一些任意的二进制;要将其转换为十六进制,将2的幂集合添加到4位二进制数的单位(“半字节”)中,即第三行。每个半字节都是一个十六进制数字。所以对每个半字节这样做,你就得到了从二进制到十六进制的结果。在上面的例子中,8+2+1 == 0xb
和8+1==9
,所以你有10111001 == 0xB9
(假设你把0作为最右边的1;如果你认为0是最左边的1,它就是0x9B
,欢迎来到字节顺序的世界……但这是另一个问题)
反之也很简单;对于你的数字:
e |0 |0 |1 |0 |0 |9 |2 |
842 | | | 1| | |8 1| 2 |
1110|0000|0000|0001|0000|0000|1001|0010|
同样,第一行是十六进制数字,中间一行是两的幂,它们加起来给出了十六进制数字,底部是位序列。
我倾向于使用计算器来转换十进制到十六进制,反之亦然,但二进制到十六进制/从十六进制,在我的头脑中按照上面的方法做。
如果你真的想使用计算器,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或从10转换为10,则不需要显式指定输入/输出数字基数。像this one一样,网上到处都是对bc
的介绍。
https://stackoverflow.com/questions/15606689
复制相似问题