問題タブ [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.
c - x86 E8およびFF呼び出し、「オンザフライ」でE8シフトアドレスを見つける方法は?基本的なx86ASM呼び出し
私はここでバイナリ難読化を使用しているので、opコードで満たされたバッファーを取得し、Linuxを使用しているので、すべての関数呼び出しは同じ呼び出し元/呼び出し先の規則を使用し、ここでは問題ありません。
私の質問はE8オペコードについてです。このオペコードは相対アドレスを使用してニアコールを取ります。
私の質問は次のとおりです。私は電話がかかってきた住所を知っています。私は電話をかけなければならない住所を知っています。それで、E8電話に入れなければならないシフトアドレスをどのように見つけることができますか?これは:
だから私のバッファには:
srandへの有効なポインタに置き換える必要がありますが、持っているものから相対アドレスを取得するにはどうすればよいですか?
FF命令で直接電話できると思っていたのですが、どうしたらいいのかわかりませんでした。代わりに5を超えるオペコードを入れることができないため(たとえば)$ eaxにアドレスをコピーできません(上記のすべてのjmp呼び出しがバナナになります)。 5バイトで直接呼び出します。
したがって、誰かがE8相対シフトアドレスを置き換えるための正しい値を取得する方法を知っている場合、またはE8呼び出しと同じ機能プロパティを維持し、5バイトだけを使用して何らかの直接呼び出しを行う方法がある場合...
(質問する前に、FF XX XX XX XXを実際のアドレスであるXXとして配置しようとしましたが、機能しませんでした。x86は呼び出しのようには見えず、INC(???)およびランダムとして解釈されます。私はこの方法で交換を試みました:
そして、私が見つけたアドレスをE8コールに入れます。とにかくうまくいきませんでした。
c++ - ゼロと比較する場合のint演算子!=および==
!=と==は、ゼロまたはゼロ以外をテストするための最速の方法ではないことがわかりました。
コンパイラ:VC ++ 11最適化フラグ:/ O2 / GL / LTCG
これは、x86-32のアセンブリ出力です。両方の比較の2番目のバージョンは、x86-32とx86-64の両方で約12%高速でした。ただし、x86-64では、手順は同じでした(最初のバージョンは、2番目のバージョンとまったく同じように見えました)が、2番目のバージョンの方が高速でした。
- コンパイラがx86-32でより高速なバージョンを生成しないのはなぜですか?
- アセンブリ出力が同じであるのに、x86-64で2番目のバージョンがさらに高速なのはなぜですか?
編集:ベンチマークコードを追加しました。ZERO:1544ms、1358ms NON_ZERO:1544ms、1358mshttp: //pastebin.com/m7ZSUrcP または http://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP
注:main.asmは非常に大きくなるため、単一のソースファイルにコンパイルするときにこれらの関数を見つけるのはおそらく不便です。別のソースファイルにzero1、zero2、nonZero1、nonZero2がありました。
EDIT2:VC++11とVC++2010の両方がインストールされている人がベンチマークコードを実行してタイミングを投稿できますか?それは確かにVC++11のバグかもしれません。
byte - いくつかのexeファイルをクラックする-バイトを削除する方法
今日、私はEXEファイルからいくつかのバイトを削除しようとしています。
EXEの中に、EXEがロードする必要のあるファイルへのパスが見つかりました。パスを変更したいのですが、そのためにはいくつかの../../文字を削除する必要があります。それを行ってファイルを保存すると、アイコンが失われ、実行しようとすると「win32unknowformaterror」が表示されます。
これらのバイトを削除せずに、に置き換える0
と、アイコンは失われず、ファイルは正しく表示されます。しかし、パスは正しくありません。
したがって、バイトを削除すると、リソース(アイコン)を含むファイル内の他の情報の位置が失われるように見えます。これらのバイトを削除した後、他のデータの同じサイズと位置を維持するために、他の6バイトを追加する必要があります。どこでやればいいですか?これらのバイトをファイルの最後に追加すると、機能しません。手がかりを教えていただけますか?ありがとう!
php - マシンコードとオペコードの違いは何ですか?
IMHOオペコードは主にPHPのコンテキストで言及されているため、この質問は主にPHPに関連しています。この説明によると、phpコードからopcodeへの変換プロセスは次のとおりです。
phpテキスト->スキャン/解析->結果=トークン->コンパイル>結果=オペコード
ここにいくつかの質問があります:
1)オペコードはマシンコードの一部にすぎませんか?マシンコードはオペコードで構成されていますか?2)Wampサーバーのコンテキストで考えると、どのPHPモジュールが責任を負っていますか?そのモジュールは、PHPコードをトークンに変換する単なるPHPインタープリターですか、それともハードウェア(プロセッサー)で実行されるオペコードにトークンをコンパイルするコンパイラーですか?
cpu-architecture - 実行時の命令検出
コードの実行中に、実行されたさまざまなマシン命令と、それぞれに必要なクロック サイクルを特定して分析したいと考えています。
これを簡単に行う方法はありますか?動的バイナリ変換は方法かもしれませんが、より簡単なメカニズムを探しています。
前もって感謝します
debugging - アセンブリ コードでエラーが見つからない
アセンブリ言語に関しては初心者です。「簡単な 68k エディター/アセンブラー」を使用して、ユーザーに 2 つの値を要求し、それらを合計して表示する 68k アセンブリ コードを記述しています。問題は、コードが停止し続け、この問題をトラブルシューティング/デバッグする方法がわからないことです。
エラーを追跡する方法を理解するのを手伝ってくれる人はいますか? 私は感謝するでしょう。前もって感謝します。
assembly - アセンブリコードから機械語への道のり
私が頭を悩ませることができないのは、コンピューターに入力して画面から読み取ったものが、コンピューターが利用して実行できるものにどのように変換されるかということです。アセンブリなどの最も低い言語でも、「アセンブリは高級言語と実際の機械語自体の間の架け橋です」と読みました。しかし、本当にこれはどのように機能しますか。コンピューターが高信号と低信号でしか動作できない場合、文字、数字、記号で動作するコンパイラーをどのように作成できますか。これらのコード文字列は、実際にどのようにしてトランジスタゲートを介して発信される高信号と低信号になりますか?キーを入力すると、実際にはコンピュータのどこかにあるレジスタに一連の信号が保存されます。s回路?それはまた、そのキャラクターの信号を画面に送信しますか、それともキーを押すとコースをとる完全に別のプロセスですか?
assembly - アセンブリは唯一の低水準プログラミング言語ですか?そうでない場合は、最も広く使用されていますか?
私は最近アセンブリを学び始めました。インターネットを見ると、アセンブリは役に立たないと言う人が増えていますが、そのような時間と労力を必要とする言語で物事をプログラムする価値はありません。高水準言語。高水準言語プログラムと低水準言語プログラムの間の効率は、今日注目を集めるほど実際には目立たないのでしょうか。また、アセンブリのような、より広く使用されている別の低水準言語はありますか?
windows - Windows .exe を手動で作成して実行する方法 (Hex エディターを使用したマシンコード)?
Hex Editor を使用するだけで、Hello World プログラムのような単純なものを作成する方法を知りたいです。アセンブラとアセンブリ言語を使用してほぼマシン レベルでこれを実行できることはわかっていますが、Hello World などのおもちゃの例で実際にマシン コードを記述して実験したいだけです。
これは、DOSBox で実行できる単純な DOS .COM ファイルである可能性があります。しかし、私の Windows PC で直接実行するための .EXE ファイルの例を誰かが提供してくれるとよいでしょう。
これは純粋な好奇心です。いいえ...バイナリマシンコードでプログラムを直接書くことは考えていません(通常、アセンブリコードを書くことさえありません。ほとんどの場合、最も低レベルのツールとしてC / C ++を使用しています)。おそらく、コンピューターの初期の頃に誰かがそれをしなければならなかったので、それが可能かどうかを知りたいだけです.
PS:このトピックについて同様の質問があることは知っていますが、実際の例を提供するものはありません。コンパイラとアセンブラが実行可能ファイルを生成する方法を理解するのに役立つように、簡単な例が必要です。つまり... 誰かが最初のプログラムで過去にこれを手作業で行ったに違いありません。また、Windows EXE フォーマットの場合、フォーマットを生成するための最初のツールと、Windows 自体がそれを読み取って実行する方法を作成した Microsoft の誰かがいたに違いありません。
performance - JIT 化された言語がネイティブの C/C++ よりも遅く、メモリ効率が低いのはなぜですか?
インタープリターは多くの余分な作業を行うため、ネイティブのマシン コードよりも大幅に遅くなることは理解できます。しかし、C# や Java などの言語には JIT コンパイラがあり、おそらくプラットフォーム ネイティブのマシン コードにコンパイルされます。
それでも、十分に正当と思われるベンチマークによると、ほとんどの場合、C/C++ よりも 2 倍から 4 倍遅いですか? もちろん、同等に最適化された C/C++ コードと比較することを意味します。私は、JIT コンパイルの最適化の利点と、最適化が不十分な C+C++ よりも高速なコードを生成できることを十分に認識しています。
そして、Java のメモリ割り当てがどれほど優れているかについての騒ぎの後で、なぜこれほど恐ろしいメモリ使用量が発生するのでしょうか? その特定のベンチマーク スイート全体で 2 倍から 50 倍、平均で約 30 倍のメモリが使用されています。
WAR を開始したくないことに注意してください。これらのパフォーマンスと効率の数値を定義する技術的な詳細について質問しています。