Assembly 创建ARM汇编程序需要有关MUL指令(ARM汇编)的帮助

Assembly 创建ARM汇编程序需要有关MUL指令(ARM汇编)的帮助,assembly,arm,multiplication,Assembly,Arm,Multiplication,我正在尝试为ARM创建一个反汇编程序,因为我想学习ARM汇编语言。我从另一个StackOverflow线程中读到,这是最好的方法。所以有一件事我遇到了麻烦,那就是正确解码乘法运算 下面是一个反汇编对象文件的示例 00008054: ==================删除不相关的指令==== 8064: e0010092 mul r1, r2, r0 根据参考手册(),乘法指令的值应为“1001”,包括位[4-7]。然而,二进制格式的e0010092是“111000100000000

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

下面是一个反汇编对象文件的示例

00008054: ==================删除不相关的指令====

8064:   e0010092    mul r1, r2, r0
根据参考手册(),乘法指令的值应为“1001”,包括位[4-7]。然而,二进制格式的e0010092是“111000100000000001000000000010”,其位4-7中有0000


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

您是如何将其转换为二进制的?十六进制9正好是二进制1001。

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

8421|8421...
===========
1011|1001...
8 21|8  1...
上一行是构成十六进制数字的2的幂-
8+4+2+1==0xf
。下一行是任意的二进制;要将其转换为十六进制,请在第三行的4位二进制数字单位(一个“半字节”)中添加两个集合的幂。每个半字节是一个十六进制数字。所以对每一个半字节这样做,你就得到了二进制的十六进制。在上面的例子中,<代码> 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|
同样,上面一行是十六进制数字,中间一行是两个幂加起来的十六进制数字,下面一行是位序列

我倾向于使用计算器将十进制转换为十六进制,反之亦然,但将二进制转换为十六进制/从十六进制转换为二进制,在我的头脑中按照上述步骤进行

如果您真的想使用计算器,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或从10转换为10,则无需显式指定输入/输出基数。
bc
的介绍遍布网络;比如。

“我正在尝试为ARM创建一个反汇编程序,因为我想学习ARM汇编语言。我从另一个StackOverflow线程中读到,这是最好的方法。”完全错误。要学习ARM汇编,请编写汇编程序(与任何其他(编程)语言一样)。@m0skit0+1是。我想知道是什么线索给了OP这个愚蠢的想法?我想知道,这样我就可以否决它,嗯,batshit疯狂。学习给定CPU的汇编的一个简单方法是让编译器将具有良好定义/约束行为的小C代码段“音译”到目标代码中,然后反汇编结果。对于初学者来说,这样做的好处有两个:a)反汇编不会被“meta-stuff”弄得乱七八糟(因为编译器创建的asm源代码是-标签、指令、注释等等),以及b)与asm源代码不同,反汇编也会显示指令操作码字节。也就是说,这种熟悉asm的方法并不要求你编写自己的反汇编程序,实际上了解操作码是没有用的(除了非常特定的主题)。你无论如何都记不住了。知道操作码是如何产生的以及它们是如何从汇编指令中产生的可能是值得的,但仍然比知道指令实际做了什么以及如何用汇编编写正确的程序重要得多。嘿,伙计们,我很感谢你们的评论。这是一条线索:我认为,拥有第二高投票权的答案之一主张这一点。那么我应该继续我的探索吗。我的错。现在我觉得自己很愚蠢。我使用了ruby的转换,出于某种原因,它弄乱了值。有没有办法删除这个问题?