0

ARMアセンブリ言語を学びたいので、ARM用の逆アセンブラを作成しようとしています。私は別のStackOverflowスレッドから、これがそれを行うための最良の方法であることを読みました。ですから、私が問題を抱えているのは、乗算のデコードを正しく取得することです。

逆アセンブルされたオブジェクトファイルの例を次に示します。

00008054 <_start>:==============無関係な指示を省略====

8064:   e0010092    mul r1, r2, r0

リファレンスマニュアル(http://www.nyx.net/~troddis/ARM.html)から、乗算命令の値はビット[4〜7]で「1001」である必要があります。ただし、バイナリのe0010092は「11100010000000000001000000000010」であり、ビット4〜7に0000があります。

私が行方不明になっていることは明らかですか?CodeSourceryのARM2012.09-64クロスコンパイラを使用しています...

4

2 に答える 2

2

どのようにバイナリに変換しましたか?16進数9は正確にバイナリ1001です。

于 2013-03-25T02:29:24.570 に答える
0

16進数から2進数への変換は、次のことを覚えていれば、主に「頭の中で」行うことができます。

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

上の行は、16進数を構成する2の累乗です- 8+4+2+1 == 0xf。下の行は任意のバイナリです。これを16進数に変換するには、2の累乗を4桁の単位(「ニブル」)の3行目に追加します。すべてのニブルは1桁の16進数です。したがって、すべてのニブルに対してこれを行うと、バイナリからの16進数が得られます。上記の場合、次のように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|

ここでも、上の行は16進数で、中央の行は合計された2の累乗が16進数を示し、下の行はビットシーケンスです。

私は電卓を使用して10進数から16進数に、またはその逆に変換する傾向がありますが、2進数から16進数への変換は、上記のように頭の中で行います。

本当に電卓を使用したい場合は、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に変換する場合、または10から変換する場合は、入力/出力の基数を明示的に指定する必要はありません。の紹介bcはウェブ全体にあります。このように。

于 2013-03-29T08:09:55.787 に答える