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

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


4
レジスターが非常に高速である場合、それ以上の数を用意しないのはなぜですか?
32ビットでは、8つの「汎用」レジスタがありました。64ビットでは、量は2倍になりますが、64ビットの変更自体とは無関係のようです。 さて、レジスタが非常に高速である(メモリアクセスがない)場合、自然にそれらの数が増えないのはなぜですか?CPUビルダーは、CPUにできるだけ多くのレジスターを機能させるべきではありませんか?私たちが持っている量しか持っていない理由に対する論理的な制限は何ですか?

7
AT&Tと比較したIntelアセンブリ構文の制限[クローズ]
現在のところ、この質問は私たちのQ&A形式には適していません。回答は事実、参考資料、または専門知識によって裏付けられることを期待していますが、この質問は、討論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善して再開できると思われる場合は、ヘルプセンターにアクセスしてガイダンスを入手してください。 8年前に閉鎖されました。 私にとって、Intel構文ははるかに読みやすいです。Intel構文のみに集中してアセンブリフォレストをたどる場合、何かを見逃しますか?AT&Tに切り替えたい理由はありますか(他のAT&Tアセンブリを読むことができる以外に)?私の最初の手がかりは、gdbがデフォルトでAT&Tを使用していることです。 これが重要な場合、私の焦点は、Linux / BSDおよびC言語との関係アセンブリおよび構文にのみ焦点を当てています。
88 c  linux  assembly  bsd 


3
指定された実行可能ファイルの外部でgdbを使用してシングルステップアセンブリコードを使用すると、「現在の関数の境界が見つかりません」というエラーが発生します
私はgdbのターゲット実行可能ファイルの外にいて、そのターゲットに対応するスタックさえ持っていません。私はx86アセンブリの専門家ではないので、とにかくシングルステップでアセンブリコードで何が起こっているのかを確認したいと思います。残念ながら、gdbはこの単純なアセンブリレベルのデバッグを行うことを拒否します。適切なブレークポイントで設定および停止できますが、シングルステップ以降を実行しようとすると、gdbは「現在の関数の境界が見つかりません」というエラーを報告し、EIPは変更されません。 追加の詳細: マシンコードはgccasmステートメントによって生成され、objdump -dの出力から、それが実行されているカーネルメモリの場所にコピーしました。ローダーを使用してオブジェクトコードを再配置されたアドレスにロードする簡単な方法は気になりませんが、ロードはカーネルモジュールで実行する必要があることに注意してください。 別の代替策は、gdbに提供する偽のカーネルモジュールまたはデバッグ情報ファイルを作成して、この領域がプログラムコード内にあると信じ込ませることだと思います。gdbは、カーネル実行可能ファイル自体で正常に機能します。 (本当に知りたい人のために、実行時にVMware VM内のLinuxカーネルデータスペースにコードを挿入し、VMwareWorkstationの組み込みgdbスタブを介してカーネルをリモートデバッグするgdbからデバッグしています。カーネルを記述していないことに注意してください。悪用;私はプロトタイプを書いているセキュリティ大学院生です。) (アセンブリ内の各命令にブレークポイントを設定できます。これは機能しますが、x86アセンブリ命令のサイズが異なり、再起動するたびにアセンブリの場所が変わるため、しばらくするとかなり面倒になります。)


30
なぜアセンブリでプログラムするのですか?[閉まっている]
クローズ。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 昨年休業。 この質問を改善する そこにいるすべてのハードコアな低レベルのハッカーに質問があります。私はブログでこの文に出くわしました。それは一般的な声明のように思われるので、私はソースが重要であるとは本当に思いません(あなたが本当に気にかけているならそれはHaackです)。 たとえば、最近の多くの3Dゲームには、C ++とアセンブリで記述された高性能コアエンジンがあります。 アセンブリに関する限り、コンパイラが余分な命令を発行したり、過剰なバイトを使用したりしたくないため、またはCで表現できない(またはなしで表現できない)より優れたアルゴリズムを使用しているため、アセンブリで記述されたコードです。コンパイラはそれらを混乱させます)? 低レベルのものを理解することが重要だと完全に理解しています。あなたがそれを理解した後、私はアセンブリのなぜプログラムを理解したいだけです。

2
「担当者」とは いいえ;」x86アセンブリの意味ですか?「一時停止」の指示と同じですか?
どういうrep; nop意味ですか? pause指導と同じですか? rep nop(セミコロンなし)と同じですか? 簡単なnop指示との違いは何ですか? AMDプロセッサとIntelプロセッサでは動作が異なりますか? (ボーナス)これらの指示の公式文書はどこにありますか? この質問の動機 別の質問のコメントでいくつか議論した後rep; nop;、x86(またはx86-64)アセンブリで何を意味するのかわからないことに気付きました。また、ウェブ上で適切な説明を見つけることができませんでした。 これrepは、「次の命令cx回数を繰り返す」ことを意味するプレフィックスであることを私は知っています(または、少なくとも、古い16ビットx86アセンブリではそうでした)。これによると、ウィキペディアでの集計表、それが思わrepだけで使用することができmovs、stos、cmps、lods、scas(多分、この制限は、新しいプロセッサ上で削除されました)。したがって、rep nop(セミコロンなしで)nop操作cx時間を繰り返すと思います。 しかし、さらに調べてみると、さらに混乱しました。これは、と思われるrep; nopとpause まったく同じオペコードにマップし、pauseちょうどより少し異なる振る舞いを持ってnop。2005年からのいくつかの古いメールは異なることを言っていました: 「力を入れすぎないように」 「2バイトのエンコーディングだけで「nop」と同等です。」 「それはIntelの魔法です。それは「いや、でも他のHT兄弟を走らせて」のようなものです。」 「Intelでは一時停止し、Athlonでは高速パディングです」 これらの異なる意見で、私は正しい意味を理解することができませんでした。 これは、Linuxカーネル(i386とx86_64の両方)でこのコメントとともに使用されています。同じコメントで、BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */でも使用されています。

4
T *をレジスタに渡すことができるのに、unique_ptr <T>はできないのはなぜですか?
私はCppCon 2019でチャンドラー・カルースの講演を見ています: ゼロコストの抽象化はありません その中で、彼は、std::unique_ptr&lt;int&gt;over を使用することによって生じるオーバーヘッドの大きさに驚いた様子の例を示していint*ます。そのセグメントは、およそ17:25の時点で始まります。 彼のサンプルのスニペットのペア(godbolt.org)のコンパイル結果を確認できます。実際、コンパイラーがunique_ptr値を渡そうとはしていないようです。ただのアドレス-レジスタ内、ストレートメモリ内のみ。 Carruth氏が27:00頃に指摘する点の1つは、C ++ ABIが値渡しパラメーター(すべてではないが、一部ではない可能性があります。レジスター内ではなく。 私の質問: これは実際には一部のプラットフォームでのABI要件ですか?(どれですか?)または、特定のシナリオでの悲観化に過ぎないのでしょうか? なぜABIはそのようなのですか?つまり、構造体/クラスのフィールドがレジスター内、または単一のレジスター内に収まる場合、なぜそのレジスター内で渡すことができないのでしょうか? C ++標準委員会は、この点について近年、またはこれまでに議論しましたか? PS-この質問をコードなしで残さないように: 単純なポインタ: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 一意のポインタ: using std::unique_ptr; void bar(int* ptr) noexcept; void baz(unique_ptr&lt;int&gt; …



1
Cコードループのパフォーマンス[続き]
この質問は、ここでの私の質問に続きます(Mysticalのアドバイスに基づいて): Cコードループのパフォーマンス 私の質問を続けると、スカラー命令の代わりにパック命令を使用すると、組み込み関数を使用するコードは非常によく似たものになります。 for(int i=0; i&lt;size; i+=16) { y1 = _mm_load_ps(output[i]); … y4 = _mm_load_ps(output[i+12]); for(k=0; k&lt;ksize; k++){ for(l=0; l&lt;ksize; l++){ w = _mm_set_ps1(weight[i+k+l]); x1 = _mm_load_ps(input[i+k+l]); y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1)); … x4 = _mm_load_ps(input[i+k+l+12]); y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4)); } } _mm_store_ps(&amp;output[i],y1); … _mm_store_ps(&amp;output[i+12],y4); } このカーネルの測定されたパフォーマンスは、サイクルあたり約5.6 FP操作ですが、スカラーバージョンのパフォーマンスの正確に4倍、つまりサイクルあたり4.1,6 = 6,4 FPopsであると予想されます。 重み係数の動きを考慮に入れると(それを指摘してくれてありがとう)、スケジュールは次のようになります。 movssスカラーの重み値をXMMレジスタに移動し、shufpsこのスカラー値をベクトル全体にコピーするために使用する操作の後に追加の命令がありますが、スケジュールは変更されていないようです。mulps負荷から浮動小数点ドメインへの切り替え待ち時間を考慮に入れると、重みベクトルをしばらくの間使用する準備ができているようです。したがって、これによって余分な待ち時間が発生することはありません。 …

6
ifステートメントとif-elseステートメントのどちらが速いですか?[閉まっている]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 3年前に閉鎖されました。 この質問を改善する 先日、この2つのスニペットについて友人と議論しました。どちらが速いのか、そしてその理由は? value = 5; if (condition) { value = 6; } そして: if (condition) { value = 6; } else { value = 5; } value行列の場合はどうなりますか? 注:私はそれvalue = condition ? 6 : 5;が存在することを知っており、より高速になることを期待していますが、それはオプションではありませんでした。 編集(質問は現在保留中のため、スタッフから要求されました): 最適化されたバージョンと最適化されていないバージョンの両方でメインストリームコンパイラ(g ++、clang ++、vc、mingwなど)によって生成されたx86アセンブリまたはMIPSアセンブリのいずれかを検討して回答してください。 アセンブリが異なる場合は、バージョンが高速である理由と時期を説明してください(たとえば、「分岐がないため、分岐に次の問題が発生するため、より良い」)

17
スタックはアセンブリ言語でどのように機能しますか?
私は現在、スタックがどのように機能するかを理解しようとしているので、自分自身にいくつかのアセンブリ言語を教えることにしました。私はこの本を使用しています。 http://savannah.nongnu.org/projects/pgubook/ 私が使用しているガスをし、上の私の開発を行っているLinuxのミント。 私は何かに少し混乱しています: 私の知る限り、スタックは単なるデータ構造です。したがって、アセンブリでコーディングする場合は、スタックを自分で実装する必要があると思いました。ただし、次のようなコマンドがあるため、これは当てはまらないようです。 pushl popl したがって、x86アーキテクチャのアセンブリでコーディングし、Gas構文を使用する場合、スタックはすでに実装されている単なるデータ構造ですか?それとも実際にハードウェアレベルで実装されていますか?それとも何か他のものですか?また、他のチップセットのほとんどのアセンブリ言語には、スタックがすでに実装されていますか? これは少しばかげた質問だと思いますが、実際にはかなり混乱しています。

19
CIL nopオペコードの目的は何ですか?
私はMSILを調べていますが、MSILには多くのnop命令があることに気づきました。 MSDNの記事によると、これらはアクションを実行せず、オペコードにパッチが適用されている場合はスペースを埋めるために使用されます。これらは、リリースビルドよりもデバッグビルドで多く使用されます。 これらの種類のステートメントがアセンブリ言語で使用されて後の命令を調整することは知っていますが、MSILでMSIL nopが必要なのはなぜですか? (編集者注:受け入れられた回答は、質問が最初に尋ねたMSIL / CIL NOPではなく、マシンコードNOPに関するものです。)
82 assembly  bytecode  cil 

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