タグ付けされた質問 「assembly」

アセンブリ言語(asm)プログラミングの質問。必ず、使用しているプロセッサや命令セット、およびアセンブラをタグ付けしてください。警告:.NETアセンブリの場合は、代わりにタグ[.net-assembly]を使用してください。Java ASMの場合は、代わりに[java-bytecode-asm]タグを使用してください。

5
GCCが整数除算を実装する際に奇妙な数による乗算を使用するのはなぜですか?
私は約読んでいるdivとmul組立オペレーション、と私はC言語で簡単なプログラムを作成することにより、アクションでそれらを見ることにしました。 ファイルDivision.c #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } そして、次のコードでアセンブリ言語コードを生成します。 gcc -S division.c -O0 -masm=intel しかし、生成されたdivision.sファイルを見ると、div操作は含まれていません。代わりに、ビットシフトとマジックナンバーを使用して、ある種のブラックマジックを実行します。計算するコードスニペットはi/5次のとおりです。 mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX movabs rdx, -3689348814741910323 ; Move some magic number to …


8
正確にベースポインターとスタックポインターは何ですか?彼らは何を指していますか?
WikiSquare()がDrawLine()を呼び出すウィキペディアからのこの例を使用すると、 (この図の下部には高いアドレスがあり、上部には低いアドレスがあることに注意してください。) 誰かが私に何ebpを説明してくれespますか? 私が見るところから、スタックポインターは常にスタックの先頭を指し、ベースポインターは現在の関数の先頭を指していると思いますか?または何? 編集:これはWindowsプログラムのコンテキストでこれを意味します edit2:また、どのように機能しeipますか? edit3: MSVC ++からの次のコードがあります。 var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h それらはすべてdwordのようで、それぞれ4バイトを使用します。したがって、hInstanceから4バイトのvar_4へのギャップがあることがわかります。彼らは何ですか?ウィキペディアの写真に見られるように、私はそれが戻りアドレスだと思いますか? (編集者のメモ:質問に属さないマイケルの回答から長い引用を削除しましたが、フォローアップ質問が編集されました): これは、関数呼び出しのフローが次のとおりであるためです。 * Push parameters (hInstance, etc.) * Call function, which pushes …
225 c++  c  assembly  x86 

4
役に立たないMOV命令を導入すると、x86_64アセンブリでタイトなループが加速するのはなぜですか?
バックグラウンド: 組み込みアセンブリ言語を使用して一部のPascalコードを最適化しているときに、不要なMOV命令に気づき、それを削除しました。 驚いたことに、不要な命令を削除すると、プログラムの速度が低下しました。 任意の、役に立たないMOV命令を追加すると、パフォーマンスがさらに向上することがわかりました。 効果は不安定で、実行順序に基づいて変化します。同じジャンク命令が1行で上または下に転置されると、速度が低下します。 CPUがあらゆる種類の最適化と合理化を行うことを理解していますが、これはより黒魔術のように見えます。 データ: 私のコードのバージョンは、時間を実行するループの途中で3つのジャンク操作を条件付きでコンパイルします2**20==1048576。(周囲のプログラムはSHA-256ハッシュを計算するだけです)。 私のかなり古いマシン(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)での結果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms プログラムはループで25回実行され、実行順序は毎回ランダムに変化しました。 抜粋: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …

30
なぜプログラムはアセンブリでより頻繁に記述されないのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 ロックされています。質問はトピックから外れていますが、歴史的に重要であるため、この質問とその回答はロックされています。現在、新しい回答や相互作用を受け入れていません。 アセンブリプログラミングはCなどの高レベルの言語よりも時間がかかり、プログラミングが難しいというのが主流の意見のようです。したがって、これらの理由により、高レベルの言語で記述する方が推奨または想定されます。移植性が向上するという理由から。 最近、私はx86アセンブリで作成しており、おそらく移植性を除いて、これらの理由はおそらく本当ではないことに気づきました。おそらく、それは親しみやすさと、アセンブリを適切に作成する方法を知っていることの問題です。また、アセンブリでのプログラミングは、HLLでのプログラミングとはかなり異なることに気づきました。おそらく、優れた経験豊富なアセンブリプログラマは、経験豊富なCプログラマがCで書くのと同じくらい簡単かつ迅速にプログラムを書くことができます。 おそらくそれは、アセンブリプログラミングがHLLとはかなり異なり、異なる考え方、方法、方法を必要とするためです。 移植性が問題でない場合、実際には、CはNASMなどの優れたアセンブラに対して何を持っているでしょうか。 編集: 指摘しておきます。アセンブリで記述する場合は、命令コードだけで記述する必要はありません。マクロとプロシージャ、および独自の規則を使用して、さまざまな抽象化を行い、プログラムをよりモジュール化し、保守しやすく、読みやすくすることができます。ここから、優れたアセンブリの作成方法に慣れることができます。

24
実行可能ファイルをリバースエンジニアリングから保護していますか?
私はC / C ++コードを逆アセンブリやリバースエンジニアリングから保護する方法を検討しています。通常、私は自分のコードでこの動作を自分で容認することは決してありません。しかし、私が取り組んでいる現在のプロトコルは、さまざまな人々のセキュリティのために、決して検査または理解されてはなりません。 今、これは私にとって新しい主題であり、インターネットはリバースエンジニアリングを防止するために実際に機知に富んでいるのではなく、リバースエンジニアリングの方法に関する大量の情報を示しています 私がこれまでに考えたことのいくつかは次のとおりです。 コードインジェクション(実際の関数呼び出しの前後にダミー関数を呼び出す) コードの難読化(バイナリの逆アセンブリを壊す) 独自のスタートアップルーチンを記述する(デバッガーがバインドするのが難しい) void startup(); int _start() { startup( ); exit (0) } void startup() { /* code here */ } デバッガーのランタイムチェック(検出された場合は強制終了) 機能トランポリン void trampoline(void (*fnptr)(), bool ping = false) { if(ping) fnptr(); else trampoline(fnptr, true); } 無意味な割り当てと割り当て解除(スタックは大幅に変更されます) 無意味なダミー呼び出しとトランポリン(逆アセンブリ出力での大量のジャンプ) 大量のキャスト(難読化された分解用) これらは私が考えたことの一部ですが、適切な時間枠が与えられれば、コードアナリストがそれらをすべて回避または把握することができます。私が持っている他の選択肢はありますか?
210 c++  c  obfuscation  assembly 

3
GCCがほぼ同じCコードに対して、このように根本的に異なるアセンブリを生成するのはなぜですか?
最適化されたftol関数を書いているとき、私はいくつかの非常に奇妙な動作を見つけましたGCC 4.6.1。最初にコードを示します(明確にするために、違いを示しました)。 fast_trunc_one、C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r …

22
インラインアセンブリ言語はネイティブC ++コードよりも遅いですか?
インラインアセンブリ言語とC ++コードのパフォーマンスを比較しようとしたので、サイズ2000の2つの配列を100000回追加する関数を作成しました。これがコードです: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES start: mov esi,0 mov ecx,lengthOfArray label: mov …
183 c++  c  performance  assembly 

7
現在のアセンブリ命令をGDBに表示します
GDBでアセンブリレベルのデバッグを行っています。現在のソース行を表示するのと同じ方法でGDBに現在のアセンブリ命令を表示させる方法はありますか?すべてのコマンドの後のデフォルトの出力は次のようになります。 0x0001433f 990 Foo::bar(p); これにより、現在の命令のアドレスがdisassembleわかりますが、現在実行中の命令を確認するには、の出力を参照し続ける必要があります。
179 assembly  gdb 

13
num ++は 'int num'に対してアトミックですか?
一般ためにint num、num++(又は++num)、リード・モディファイ・ライト動作として、ある原子ではありません。しかし、GCCなどのコンパイラが次のコードを生成することがよくあります(ここで試してください)。 に対応する5行目num++は1つの命令なので、この場合num++ はアトミックであると結論付けることができますか? もしそうなら、それは、そのように生成num++されたデータレースの危険なしに同時(マルチスレッド)シナリオで使用できることを意味します(つまり、たとえば、それを作成する必要がなくstd::atomic<int>、関連するコストを課します。とにかくアトミック)? 更新 この質問はインクリメントがアトミックであるかどうかではないことに注意してください(そうではなく、それが問題の最初の行でした)。それはかどうかだことができ、特定の場合で1命令自然の缶はのオーバーヘッドを回避するために悪用されるかどうか、すなわち、特定のシナリオでも接頭辞を。そして、受け入れられた回答がユニプロセッサマシンに関するセクションで言及しているように、この回答と同様に、そのコメントでの会話や他の人が説明しているように、それは可能です(ただし、CまたはC ++ではできません)。lock


1
ARMチップにJavascriptという名前の命令(FJCVTZS)があるのはなぜですか?
FJCVTZSは、「浮動小数点Javascriptを符号付き固定小数点に変換し、ゼロに向かって丸める」です。Armv8.3-Aチップ以降でサポートされています。JavaScriptがベアメタルにそれほど近いとは思わないので、これは奇妙なことです。 命令の機能の説明はありますが、なぜ存在するのかはわかりません。 このスレッドは、「JSには整数型がないため、特定のユースケースでは、アルゴリズム上の理由がないために、この操作がわいせつに必要になることが多いため、単一の命令として存在します」と述べています。それはもっともらしいですが、もっと詳しく理解したいと思います。
148 javascript  assembly  arm 

13
日常の機械はどのようにプログラムされていますか?
日常の機械(電化製品やデジタル時計など、コンピューターやモバイルデバイスではない)はどのようにプログラミングされていますか?コカコーラの自動販売機のプログラミングにはどのようなコードが含まれますか?私のコーヒーメーカーは、事前にプログラムされた時間をどのように受け入れ、その時間が到着した後、コーヒーのポットの醸造をどのように開始しますか? これらの種類のマシンは内部にオペレーティングシステムを持っていますか、それとももっと基本的なものですか?彼らはアセンブリ、C、または他の言語で書かれていますか? そして、これらのオペレーティングシステムまたは基になるコードシステムをリストするリソースを見つけたいと思います。できれば、ソースコードを使用することもできます。誰かがそのようなリソースを知っている場合(検索しても何も得られなかった)、それは素晴らしいことです。


7
このmilw0rmヒープスプレーエクスプロイトはどのように機能しますか?
私は通常、JavaScriptコードを読むのに困難はありませんが、このコードではロジックを理解できません。コードは4日前に公開されたエクスプロイトからのものです。あなたはでそれを見つけることができますmilw0rm。 これがコードです: <html> <div id="replace">x</div> <script> // windows/exec - 148 bytes // http://www.metasploit.com // Encoder: x86/shikata_ga_nai // EXITFUNC=process, CMD=calc.exe var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580"); // ugly heap spray, the d0nkey way! // works most of the time var spray = unescape("%u0a0a%u0a0a"); do { spray += spray; } while(spray.length < 0xd0000); memory …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.