問題タブ [machine-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
908 参照

c - アセンブリ opcode DIV を C コードに変換する方法

ねえ、私はたくさんの質問をしていることを知っています..しかし、これに関するGoogleのリソースはあまりないので、これが将来同様のプロジェクトを試みようとする人々に役立つことを願っています.

アレックスが投稿したインテルのマニュアルを見ましたが、私にはかなり異質なようです 。 vol-2a-2b-instruction-set-az-manual.html

DIVだから、単純なオペコードがどのように機能するかを知っていると思っていました。だってdivide、やっぱり。を追加するのに何の問題もありませんでした。もちろん、ADD皆さんが私を助けてくれたという問題がありました。難易度的には同じカテゴリーに入るようです。SUBIMULDIVIMUL

マニュアルを使用せずに、OllyDbg で自己デバッグ テストを行うだけです。

除算の答えは常に に格納されていることがわかりましたEAX。計算された残りは、誰が知っていたのか、に保管されていEDXます。

このアルゴリズムを研究することは非常に重要であり、誰かが乱数除算の残りを使用して 0 から 10 の非常に巧妙なスイッチを生成することを知っていました..しかし、それでも私の質問です。

16 進数を割ると余りがあり、小数点がそれらに属さないとは考えたこともなかったのは、すでに奇妙です。

のようになります

私は最初に残りを得るかもしれないと思っていました..簡単なことです。

わかりました、私は数学的プログラミングをほとんど扱っていないので、少し混乱しています。私は、結果を文字列に保存してから小数点で分割する方が多く、それが残りを取得する方法です。そうです、遅いことはわかっていますが、簡単な道を進んでいます..数学コードの演算。

わかりました..私がそこに置いたCコードを見て..おそらく両方を格納する必要EAXECXあり、一時変数で除算が発生する前に..または剰余コードを最初に実行し、次に除算コードを実行します. 知らない。

たぶん、皆さんが私にもっと良い答えを提供してくれるかもしれませんが、おそらく1行で行うことはできませんが、いくつかの間違いを犯した可能性があります。ソフトウェアをコンパイルする前に修正する必要があります。

0 投票する
1 に答える
992 参照

assembly - AMD64 マシンコード「48 ff 25」は何を意味しますか?

次の逆アセンブル コードで "0x48ff25" が何を意味するか教えてもらえますか?

AMD64 アーキテクチャ プログラマーズ マニュアルを確認しましたが、自分で答えを見つけるのは本当に難しいです...

0 投票する
2 に答える
4241 参照

x86 - 実行可能バイナリの命令を編集するために16進エディタを使用できますか?

コンパイルされたCコードを含むバイナリ実行可能ファイルがある場合、16進エディターを使用してそのバイナリを編集し、特定の命令をまたはなどの別の命令に変更できますnopjmp?変更したい命令のオフセットをどのように知ることができますか?


はい、これは教育目的です。

0 投票する
4 に答える
574 参照

dos - 実行可能ファイルが何をするかを知るにはどうすればよいですか?

マシン命令の短いセット (160 バイト) がありますが、それが何をするのかわかりません。

私はMacを使用しており、GDB逆アセンブラーで実行したところ、次のようになりました。

私はアセンブラをほとんど知りませんが、いくつかのコマンドはおかしく見えました ( のようにrex.RXB, rex.WB, rex.B)。それで、少しグーグルした後、DOS実行可能ファイルであると私に言った次のコマンドを見つけました:

  • DOS 実行可能ファイルを逆アセンブルできるプログラムはありますか?

そうでない場合は、160 バイトしかないため、手動で逆アセンブルしようとします。ただし、各バイトの意味の参照が必要になります。例えば

  • DOS マシン コード命令について、このようなリファレンスはありますか?

  • プログラムが何をするかを知るには、他にどのような方法がありますか?


アップデート:

IGOR からのすばらしい提案の後、別のプログラムを使用してコードを逆アセンブルしました。ただし、まだいくつかの悪い指示があります。

  • なぜそれが言うの(bad)ですか?
0 投票する
3 に答える
1707 参照

x86 - マシンコードはどのようにしてサブルーチン呼び出しへのパラメータにアクセスしますか?

プログラムを実行するときは、パラメータを渡すことができます。

argvCでは、を見てこれらのパラメータにアクセスできます。

これはアセンブリ/x86マシンコードでどのように変換されますか?与えられた変数にどのようにアクセスしますか?システムはこれらの変数をどのように提供しますか?

アセンブリは非常に新しいので、レジスタと絶対アドレスにしかアクセスできないようになっています。パラメータにアクセスする方法に戸惑っています。システムはパラメータを特殊レジスタにプリロードしますか?

0 投票する
4 に答える
22164 参照

x86 - x86アセンブリで、比較操作を行わずにゼロフラグ(ZF)を設定するにはどうすればよいですか?

(x86)アセンブリの短い部分があり、それが何をするのかを理解しようとしています。

「JNE」がfalseと評価されるまで、つまりゼロフラグ= 0になるまで、ループしているように見えます(おそらく、数値1、2、3 ...をスタックに入れますか??)

アセンブリに関する私の短い調査(これは初めてです)から、比較操作(CMP)を実行してゼロフラグを設定したことがわかりますが、比較操作が表示されません。

では、どのような条件下でこのループから抜け出すのでしょうか?

0 投票する
4 に答える
6300 参照

assembly - ホモイコニックで「制限のない」自己修正コード + Lisp は本当に自己修正ですか?

私の Lisp に関する知識はごくわずかであることを率直に認めます。しかし、私はその言語に非常に興味があり、近い将来、それを真剣に学び始める予定です. これらの問題に対する私の理解には間違いなく欠陥があるため、明らかに間違っていることを言う場合は、反対票を投じるのではなく、コメントして修正してください。

真のホモイコニックで自己修正可能な言語

Homoiconicity (コードはデータと同じ表現を持つ) と無制限の自己変更 (新しいコードを発行したり、関数ポインターを変更したりするだけでなく、実行中のコードのあらゆる側面を変更できることを意味する無制限の意味) の両方をサポートするプログラミング言語の例を探しています/代議員。)

私がこれまでに見つけた、この基準に適合する例は 3 つしかありません。

  1. マシンコード。すべてが数字であるホモイコニック。ポインターが含まれているという点で無制限に変更可能であり、そのアドレスがコードまたはデータを保持しているかどうかに関係なく、任意のメモリ アドレスを操作するために使用できます。
  2. マルボルジ。マシンコードと同じ理由。すべての命令は、実行後に自身を変更します
  3. DNA。プログラミング言語ではありませんが、それでも興味深いものです。マシンコードと同じ意味での自己変更ではありません。実際の命令とデータが変更された場所。ただし、それは自己複製であり、以前の状態に応じて変異/進化する可能性があります (放射線などの副作用が時々発生します)。とにかく、これは自己修正の間接的な方法です。簡単に言えば、DNA は自己改変することができますが、それは関連する突然変異と共にその全体を複製することによって行われます。DNA の物理的な文字列は「不変」です。

Lisp がこのリストにない理由

Lisp はそのリストに含まれていません。なぜなら、Lisp はほぼホモイコニックであり、制限付きの自己変更しかサポートしていないように思われるからです。次のようなことができます

と同じことを行います

最初のバージョンでは(+ 1 2 3)は生のコードですが、2 番目のバージョンではデータです。このステートメントが真実であると仮定することにより、Lisp はホミニックでさえないと主張することができます。コードは、リスト/ツリー/S 式の両方であるという意味で、データと同じ表現をしています。しかし、これらのリスト/ツリー/S 式のどれがコードで、どれがデータであるかを明示的にマークしなければならないという事実は、結局のところ Lisp はホミニックではないと言っているように思えます。表現は非常に似ていますが、コードまたはデータを扱っているかどうかを実際に言わなければならない細部が異なります。これは決して悪いことではありません (実際、それ以外のことはすべて狂気です) が、Lisp とマシン コードの違いを浮き彫りにしています。マシン コードでは、どの数値が命令で、どの数値がポインターで、どの数値がデータであるかを明示的にマークする必要はありません。

これは、無制限の自己変更に対するさらに強力なケースです。もちろん、コードを表すリストを取得して操作することもできます。たとえば、

そして、あなたはそれを実行しますeval。しかし、これを行うと、コードをコンパイルして実行するだけです。既存のコードを変更するのではなく、新しいコードを発行して実行するだけです。C# は式ツリーを使用してまったく同じことを行うことができますが、形式があまり便利ではありません (これ、独自の AST である Lisp とは対照的に、C# コードがその AST とは異なる表現を持つために発生します)。実際にソース ファイル全体を取得し、実行中にそのソース ファイル全体を変更して、ソース ファイルに加えられた変更がプログラムの動作にリアルタイムで影響を与えることはできますか?

これを行う何らかの方法がない限り、Lisp はホモニックでも自己修正でもありません。(定義に関する議論を先延ばしにするために、Lisp はホモイコニックでもなければ、マシン コードと同じ程度の自己修正でもありません。 )

Lisp Homoiconic/Unrestrictly 自己変更可能にする方法

Lisp をマシンコードのようにホモイコニック/自己修正可能にする 3 つの方法が考えられます。

  1. 非フォンノイマン アーキテクチャ。誰かが、プログラムの最下位レベルの表現が直接実行できる AST である驚くべき仮想マシンを発明できたら (それ以上のコンパイルは必要ありません)。そのようなマシンでは、AST は実行可能な命令とデータの両方を表します。残念ながら、AST は依然としてコードまたはデータのいずれかでなければならないため、問題は解決されていません。eval 関数が存在しても、これは変わりません。機械語では、コードとデータの間を好きなだけ行ったり来たりできます。一方、eval と Lisp では、リストをデータからコードに「評価」して実行すると、そのリストを再びデータとして取得する方法はありません。実際、そのリストは永久になくなり、その値に置き換えられました。たまたまポインターである重要なものが欠けている可能性があります。
  2. ラベルを一覧表示します。すべてのリストにも一意のラベルが必要である場合、特定のラベルを持つリストに対して関数を実行することにより、間接的な自己変更を行うことができます。継続と組み合わせることで、最終的にマシンコードと同じ意味で自己修正コードが可能になります。ラベルは、マシン コードのメモリ アドレスと同等です。例として、AST の最上位ノードに「main」というラベルが付いている Lisp プログラムを考えてみましょう。次に、main 内で、ラベル、整数、アトムを受け取る関数を実行し、アトムを、関数に指定されたインデックスに一致するラベルを使用してリストにコピーできます。次に、メインで現在の継続を呼び出します。ほら、自己修正コード。
  3. Lisp マクロ。私は Lisp マクロを理解するのに時間をかけたことがありません。実際、それらは私が考えていることを正確に実行する可能性があります。

ポイント 1. と 2. を組み合わせると、完全に自己変更的な Lisp が生成されます。説明されている魔法の Lisp マシンを作成できるという条件で。2. 単独で自己変更 Lisp を作成できますが、フォン ノイマン アーキテクチャでの実装は非常に非効率的です。

質問

  1. マシンコード、DNA、malbolge 以外に、完全自己改変が可能でホモイコニックな言語はありますか?
  2. (上記のテキストで tl;dr を実行した場合は、わざわざ回答しないでください) . Lispは本当にホモイコニック+自己修正ですか? もしあなたがそうおっしゃるなら、私の議論のどこで私が道に迷ったのかを正確に引用していただけますか?

付録

制限のない自己修正を伴うがホモニシティを持たない言語

  1. 組み立て。コードは数字ではなく単語を使用するため、同義性は失われますが、メモリに対する完全な制御を保持し、無制限の自己変更を可能にするポインタがまだあります。
  2. 生のポインターを使用するすべての言語。例: C/C++/Objective C。アセンブリと同じ引数
  3. 仮想ポインターを含む JIT 言語。たとえば、安全でないコンテキストで実行されている C#/.net などです。Assembly と同じ引数。

何らかの形で関連/興味深い可能性のあるその他の概念と言語: Lisp、Ruby、Snobol、Forth とコンパイル時のメタプログラミング、Smalltalk とそのリフレクション、すべてが関数であるというプロパティを持つ型指定されていないラムダ計算 (これは、ラムダ計算を直接実行するマシンを発明できれば、ラムダ計算はホモイコニックであり、フォン ノイマンのマシン コードは、そのマシンで実行するとそうではありません.[そして、ゲーデルの定理は実行可能になるでしょう.ハハ、恐ろしい考え :P])

0 投票する
2 に答える
544 参照

machine-code - マシンコードジャンプ先計算

わかりましたので、プログラムをフックする必要がありますが、これを行うには命令をコピーしますE8 <Pointer to Byte Array that contains other code>。これの問題は、アセンブルするCall 0x100E8 FD、E8 が呼び出し命令であることがわかっているため、FD が宛先であることがわかっているため、アセンブラは 0x100 から FD への宛先をどのように取得するのでしょうか? ありがとう、ブラッドリー - インセプト

0 投票する
3 に答える
423 参照

c++ - パフォーマンスを高く維持しながら、標準のC /C++コードにカスタム命令/拡張機能を含めて変換する方法

FPGAおよびASIC用の汎用画像処理コアを開発しています。アイデアは、標準のプロセッサをそれに接続することです。私が抱えている問題の1つは、それを「プログラム」する方法です。説明させてください:コアには、私の「カスタム」拡張機能用の命令デコーダーがあります。例えば:

そしてもっとそのようなものがたくさんあります。この操作は、次のようなプロセッサforループ、非ベクトル操作などを使用して、プロセッサによってバスを介してコアに送信されます。

プログラムはC/C++で書かれています。コアは、マシンコードでの命令自体のみを必要とします

  1. オペコード=vector_add= 0x12h
  2. register_src_1 = v0 = 0x00h
  3. register_src_2 = v1 = 0x01h
  4. register_dst = v2 = 0x02h

    マシンコード=opcore| v0 | v1 | v2 = 0x7606E600h

(または何でも、バイナリで命令を構築するためのさまざまなフィールドの単なる組み合わせ)

バスを介してコアに送信すると、コアは専用バスを使用してメモリからすべてのデータを要求し、プロセッサを使用せずにすべてを処理できます。大きな手がかりは、前の命令を16進表現に変換するにはどうすればよいかということです。(バスを介して送信しても問題ありません)。頭に浮かぶいくつかのオプションは

  • インタプリタされたコードを実行する(プロセッサで実行時にマシンコードに変換する)->ある種のインラインマクロを使用しても、非常に遅い
  • カスタムセクションを外部カスタムコンパイラでコンパイルし、外部メモリからバイナリをロードして、独自の命令でコアに移動します->ソースコードの読み取り/理解が難しい、SDK統合が不十分、コードが非常にセグメント化されている場合はセクションが多すぎる
  • JITコンパイル->これだけで複雑になりますか?
  • コンパイラの拡張->悪夢!
  • ループ、ポインタ、メモリ割り当て、変数など、すべてを処理するためにカスタムコアに接続されたカスタムプロセッサ...->作業が多すぎる

問題はソフトウェア/コンパイラに関するものですが、このトピックに関する深い知識を持っている人にとっては、これはFPGAのSoCであり、メインプロセッサはMicroBlazeであり、IPコアはAXI4バスを採用しています。

正しく説明できたらいいのに…よろしくお願いします!

0 投票する
1 に答える
128 参照

performance - 最も効率の悪いマシンコードを生成するswitchステートメントはどれですか?

テストの1つで、どのswitchステートメントが最も効率の悪いマシンコードを生成するかを尋ねる質問があります。考えられる答えは、O4、O1、O2、またはO3でした。私はそれらが何を意味するのかわかりません。