首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建ARM反汇编程序需要有关MUL指令的帮助(ARM装配)

创建ARM反汇编程序需要有关MUL指令的帮助(ARM装配)
EN

Stack Overflow用户
提问于 2013-03-25 10:25:37
回答 2查看 303关注 0票数 0

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

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

00008054 <_start>:==============ommitted无关说明====

代码语言:javascript
运行
复制
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交叉编译器...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-25 10:29:25

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-29 16:09:56

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

代码语言:javascript
运行
复制
8421|8421...
===========
1011|1001...
8 21|8  1...

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

反之也很简单;对于你的数字:

代码语言:javascript
运行
复制
e   |0   |0   |1   |0   |0   |9   |2   |
842 |    |    |   1|    |    |8  1|  2 |
1110|0000|0000|0001|0000|0000|1001|0010|

同样,第一行是十六进制数字,中间一行是两的幂,它们加起来给出了十六进制数字,底部是位序列。

我倾向于使用计算器来转换十进制到十六进制,反之亦然,但二进制到十六进制/从十六进制,在我的头脑中按照上面的方法做。

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

代码语言:javascript
运行
复制
$ 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的介绍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15606689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档