• ベストアンサー

逆アセンブラの機能について

こんにちは、度々お世話になります 逆アセンブラとは、特定の命令や関数のアドレスを出力する機能はあるのでしょうか また、そのような機能を搭載した逆アセンブラはどんなものがありますか

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>なぜ意味がないのか、もう少し具体的に教えていただけると助かります >また、その場合どうやってアドレスを求めるのでしょうか マシンコードを逆アセンブルして解析するつもりなら、もう少しCPUの動作とコンピュータプログラムのたどってきた歴史を知っておいた方がいいと思います。 一番原始的なプログラムはCPUに電源が入って、リセット信号が立ち上がった時に走るもので、通常は番地固定でROMに書かれています。ですのでプログラムのアドレスは固定です。OSの入っていない組み込み機器などの場合には、最後のアプリケーションまで位置固定のコードでも問題はありません。そういったモノの場合には、先頭アドレスを指定したら、番地を表示してくれる逆アセンブラもあるでしょう。 そうでなく、OSが走る環境のコードの場合。 原始のOSは、プログラムのロードアドレスが固定されていました。あるいは、自身で設定されていたモノもあったかも知れません。そういうものは、例えば固定アドレスジャンプなどあったでしょう。そういったコードの逆アセンブル結果には、アドレスは表示されると思います。 しかしOSが複雑になってくると、色々なプログラムがメインメモリにロードされるようになり、アドレスを固定しちゃうと困る事態が発生します。OSの機能も実行アドレス・OS内部の固定アドレスに依らない方法を採用します。 CPUもまた、実行コードがどこにロードされてもそのまま動作する仕組みをサポートするようになります。 PCリラティブとか、相対アドレス・相対ジャンプとか調べてみるといいでしょう。 これらの経緯により固定アドレスというのは殆ど意味を失いました。が、実際にジャンプする場所は存在するわけですから、まともな逆アセンブラならジャンプ・コール或いはロード・ストアの場所は(擬似的なシンボルによって)出力するでしょう。でもアドレスは出ないと思います。 それと、何を逆アセンブルするのか?というのも問題です。前の方の指摘通り、実行コードでないものを実行コードと解釈しては意味がありません。それには、対象がROMプログラムなのか、OS上の実行ファイルなのか?ファイル形式は何なのか?など考える事は多いハズです。それによってプログラムの開始場所や、CPUの動作モード、ファイル構造が違うからです。 …「特定の命令や関数のアドレス」ってこういう事を言ってます?

noname#180000
質問者

お礼

いろいろな情報ありがとうございます 「こういう事」でよいです たいへん勉強になりました

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

マイコンを相手にするのか、WindowsやLinuxなどの規模の大きいOSを相手にするのかで話が違います。 あと内部の関数などはコンパイル時のデバッグ情報が必要ですが、DLLなどではデバッガが情報が得られるモノもあります。 つまり、状況を限定しないとなんとも言えないとしか答えが返せないのです。

noname#180000
質問者

お礼

回答ありがとうございます やはり、規模の大きい OS では状況が違ってくるのですね・・・ 勉強になりました

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

バイト列を与えてそこから「特定の命令」や「特定の関数」のアドレスが分かるかと言ったら, 普通は無理. そもそも「命令を表すバイト列」なのか「データとして持っているバイト列」なのかが区別不可能です. 例えば 8086 で push bp は 55 という 1バイトの命令になるんだけど, だからといって「55 というバイトは必ずこの命令である」とは言えない. "Use the force, Luke" の最初の U のところで push bp を見つけた っていわれても, 普通は困りますよね.

noname#180000
質問者

お礼

貴重な情報ありがとうございます 命令を表すバイト列とデータであるバイト列が区別できないのですね・・・

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.2

8ビットマイコンなどなら絶対アドレスが意味ありますが、現在のCPUではメモリイメージからアドレスを求めても意味ありません。CPUにより複雑なメモリマッピングが行われています。

noname#180000
質問者

お礼

回答ありがとうございます >メモリイメージからアドレスを求めても意味ありません なぜ意味がないのか、もう少し具体的に教えていただけると助かります また、その場合どうやってアドレスを求めるのでしょうか

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

あるといえばありますが、それは前もって情報として与えておかないと勝手に命令や関数のアドレスを求めたりしません(というよりできません)

noname#180000
質問者

お礼

回答ありがとうございます 前もって情報として与えておく必要があるのですね

関連するQ&A