• ベストアンサー

アセンブリ言語について。

アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。

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

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

>どんなアセンブリ言語なら逆アセンブルで完全復元できるアセンブリコードの例を教えていただけないでしょうか?すみません。 先ほども言った通り、 すべてのマシン語は逆アセンブルで元のニーモニックに戻ります。 アセンブラソースに戻らないだけです。 元々入っていないものは、当然復元は不可能ですから。 なお、この件、追いかけるより、 別のアプローチしたほうがいいかと思いますよ。 元々不可能な件を追いかけてるように見えます。 人生は1回しかないので、多数の方向性を同時に見たほうが いい結果につながりますよ!ではでは

その他の回答 (2)

回答No.2

>でも逆アセンブルすると完全復元できるアセンブリコードも存在するのですよね?教えていただけないでしょうか?すみません。 #1さんが、答えてる通りですよ。 ディスアセンブルですべてのマシン語はニーモニックに戻せます。 ですので、完全復元?ということであれば、これは完全復元です。 ただし、コメントなど、そもそもアセンブル時に不要な物は、 元々入っていないのですから、逆変換は無理だということです。 例えばジャンプ命令も、絶対アドレスと相対アドレスがあり、 相対の場合、そこがラベルなのは、番地なのかは、 どちらでもいい事です。 考える必要すらないのです。 なぜなら、実行するのに不要な情報だからです。 事前にマシン語が、コンピューターが動くのに必要な バイナリコードだと覚えたはず!なので、 コンピューターが実行するのに必要ではない情報が 混ざっているなら、もはや、マシン語ではないですからね。 なお、コンパイラーを使う言語でも、 普通はコメント類や関数名、変数名その他は、 入りませんので、この場合でも、捨てられます。 理由は、「コンピューターが実行するのに必要ではない情報」だからです。 「普通は」の逆が「デバッグ情報入り」なのですが、 ステップトレースをIDEの上で使用するもので、 通常入っていないと思って正しいですよ。 ということで回答は >実行ファイルがあれば逆アセンブルすると >完全に元のアセンブリコードが復元できるのでしょうか? 「アセンブリコード」は完全に復元できる。 しかし、アセンブラソースではなく、あくまで 逆アセンブルで得られる部分のみになる。 それと、もう1つ、 実行「ファイル」と書かれているので、気になりましたが。 実行ファイルの機械語と実行中の機械語には、 少々違いがあります。 実行リロケーションで変換されるエリアもあり、 必ずしも同じとは限らないので、ご注意を。

zasx1097
質問者

補足

どんなアセンブリ言語なら逆アセンブルで完全復元できるアセンブリコードの例を教えていただけないでしょうか?すみません。

回答No.1

アセンブリ言語の中で人間が分かりやすいようにラベルとか使ってるなら、ラベルやコメントは復元できません。 例えば、 Wikipedia - CASL#サンプルコード https://ja.wikipedia.org/wiki/CASL#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89 はCASL IIなんか久々に見る自分でもわかりやすいですが、 これをコードに変換、逆変換すると、ラベルが消えちゃって、例えば、 LD GR0,$1a4 LD GR1,$1a6 LD GR2,$1a8 LD GR3,$1aa CALL $10c RET CPA GR0,=1 JZE $14a SUBA GR0,=1 PUSH 0,GR2 ~ みたいな事になって、何やってるのか確認するのは大変です。

zasx1097
質問者

お礼

どんなアセンブリ言語なら逆アセンブルで完全復元できるアセンブリコードの例を教えていただけないでしょうか?すみません。

zasx1097
質問者

補足

でも逆アセンブルすると完全復元できるアセンブリコードも存在するのですよね?教えていただけないでしょうか?すみません。

関連するQ&A

  • アセンブリ言語と機械語について。

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか?

  • アセンブリ言語のjmpについて

    実行ファイルを逆アセンブルして出てきたjmp(far)というのが良く分かりません。これはどういう動作なんですか? 対応するオブジェクトコードはFF 25 20 F1 40 00となっています。

  • プログラミングについて。

    コンピュータは電圧の高い(H)と低い(L)を2進数としてCPUがクロック信号の入力を受けて処理します。 2進数はそのままだと扱いづらいので、数値的に親和性のある2のn乗進数を使います。 一般にコンピュータは1オクテットを1バイト、1ワードとしています。 その時16進数2桁で1バイトとなることから16進数表記が使われています。 なので、極論で言えば16進数2桁ではなく256進数1桁でも良かったという事です。 実は、大抵のアセンブリ言語は2進数表記を扱えます(8進数も使えるかも)。 アセンブラは16進数でも2進数でもそのまま対応するマシン語に置き換えていくものです。 アセンブリ言語とマシン語は一体一で対応しているので、実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。 マクロアセンブラの場合はマクロ命令までは再現されませんが、ここでは関係無いので割愛します。 つまり、マシン語とアセンブリ言語は本質的に全く同じものです。 単に、人間に読みやすく見せているものアセンブリ言語です。 マシン語もアセンブリ言語も低水準言語です。 高水準言語とは、C言語などのコンパイルを必要とするものや、BASICやJavaScriptのようにインタープリタを必要とするもののことです。 こちらは、CPUが直接解釈できるマシン語とは全く違う人間の都合に合わせた表現でコーディングし、後からマシン語に変換する仕組みのものです。 人間に読みやいコードをマシン語に変換するので、関係は一体一ではありません。 つまりコンパイルやインタープリットすると元の情報(ソースコード)は失われます。 で、① インタープリタとインタープリットとは何でしょうか?教えていただけないでしょうか?すみません。 ② マクロアセンブラの場合はなぜマクロ命令が再現されないのでしょうか?教えていただけないでしょうか?すみません。 ③ 実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。とはどういう事でしょうか?つまり、実行ファイルというのは、プログラマーが書いたソースコードのことでしょうか?教えていただけないでしょうか?すみません。 教えていただけないでしょうか?すみません。

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • C言語をCPUに読み込ませるためには、 C言語か

    C言語をCPUに読み込ませるためには、 C言語からアセンブリ言語にコンパイルして、 アセンブリ言語からアセンブルして機械語2進数にしてCPUに読み込ませるという 2段階をしないといけないんですか? 下記の画像のように説明している動画がありました

  • osのwindowsはアセンブリ言語でも作られてい

    osのwindowsはアセンブリ言語でも作られていると書いてあるんですが、 アセンブリ言語って機械語に近い低級言語ですよね? windowsを人間がコーディングするときにアセンブリ言語を打つんですか? 大変じゃないんでしょうか?

  • アセンブリ言語について。

    アセンブリ言語がアセンブラ&実行出来るサイトを知らないでしょうか?また、アセンブリ言語のプログラムが載っているサイトを知らないでしょうか?教えて頂けると幸いです。

  • プログラミング言語の アセンブリ言語 ニーモニ

    プログラミング言語の アセンブリ言語 ニーモニック マシン語 機械語 バイナリー 0と1で表す言語010010等 これらの違い関係性を教えてください

  • 機械語とアセンブリ言語の違いを教えてください

    機械語とアセンブリ言語の違いを詳しく教えていただけんか?