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

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


3
関数から構造体を返すときのGCCバグの可能性
O'NeillのPCG PRNGの実装中にGCCのバグを見つけたと思います。(Godboltのコンパイラエクスプローラの初期コード) 、(rdiに格納された結果)を乗算oldstateした後MULTIPLIER、GCCはその結果をINCREMENTに追加せず、INCREMENT代わりにrdxに移動し、rand32_ret.state の戻り値として使用されます。 最小限の再現可能な例(コンパイラエクスプローラ): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成されたアセンブリ(GCC 9.2、x86_64、-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in imm32) xor …
133 c  gcc  assembly  x86-64  compiler-bug 


15
C配列に値が存在するかどうかをすばやく見つけるには?
サイズが256(できれば1024、ただし256が最小)の配列を反復処理し、値が配列の内容と一致するかどうかを確認する必要のある、タイムクリティカルなISRを備えた組み込みアプリケーションがあります。boolこの場合、A はtrueに設定されます。 マイクロコントローラーはNXP LPC4357、ARM Cortex M4コア、コンパイラーはGCCです。私はすでに最適化レベル2(3は遅い)を組み合わせ、フラッシュではなくRAMに関数を配置しています。また、ポインター演算とforループを使用します。これは、アップではなくダウンカウントを行います(かどうかのチェックi!=0は、かどうかのチェックよりも高速ですi<256)。結局のところ、私は12.5 µsの持続時間で終了していますが、これは実現可能にするために大幅に削減する必要があります。これは私が今使っている(疑似)コードです: uint32_t i; uint32_t *array_ptr = &theArray[0]; uint32_t compareVal = 0x1234ABCD; bool validFlag = false; for (i=256; i!=0; i--) { if (compareVal == *array_ptr++) { validFlag = true; break; } } これを行う最も速い方法は何でしょうか?インラインアセンブリの使用が許可されています。他の「あまりエレガントでない」トリックも許可されています。

3
x86での「非一時的」メモリアクセスの意味は何ですか
これはやや低レベルの質問です。x86アセンブリには、2つのSSE命令があります。 MOVDQA xmmi, m128 そして MOVNTDQA xmmi, m128 IA-32ソフトウェア開発者マニュアルでは、MOVNTDQA のNTはNon-Temporalを表し、それ以外はMOVDQAと同じであると述べています。 私の質問は、非時間的とはどういう意味ですか?
123 x86  sse  assembly 


5
ESIおよびEDIレジスタの目的は?
アセンブラでのEDIおよびESIレジスタの実際の目的と使用法は何ですか? 私はそれらが文字列操作に使用されていることを知っています。 誰かも例を挙げられますか?
119 assembly  x86 


8
`testl` eax対eax?
いくつかのアセンブリを理解しようとしています。 次のようなアセンブリ、私はtestl行に興味があります: 000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004 movl 0x04(%eax), %eax 000319e5 85c0 testl %eax, %eax 000319e7 7407 je 0x000319f0 とのtestl間のそのポイントを理解しよう%eaxとしてい%eaxますか?このコードの詳細は重要ではないと思います。テストをそれ自体で理解しようとしているだけです。値は常に真ではありませんか?

4
Gnu Assembler(GAS)のCFIディレクティブは何のために使用されますか?
すべての行の後.CFIディレクティブがあるように思えるし、また、これらの元の広いvaritiesがあります。、 .cfi_startproc、.cfi_endprocなど。 もっとここには。 .file "temp.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl $0, %eax leave ret .cfi_endproc .LFE0: .size main, .-main .globl func .type func, @function func: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, …
118 assembly  gas 

3
32ビットレジスタのx86-64命令が完全な64ビットレジスタの上位部分をゼロにするのはなぜですか?
ではインテルのマニュアルのx86-64のツアー、私が読んで おそらく最も驚くべき事実はMOV EAX, EBX、RAXレジスタなどの上位32ビットを自動的にゼロにするなどの命令です。 同じ出典で引用されているIntelのドキュメント(手動の基本アーキテクチャで64ビットモードの3.4.1.1汎用レジスター)は、次のように述べています。 64ビットのオペランドは、宛先の汎用レジスターで64ビットの結果を生成します。 32ビットのオペランドは32ビットの結果を生成し、デスティネーションの汎用レジスターで64ビットの結果にゼロ拡張します。 8ビットおよび16ビットのオペランドは、8ビットまたは16ビットの結果を生成します。デスティネーション汎用レジスタの上位56ビットまたは48ビットは、それぞれ操作によって変更されません。8ビットまたは16ビット演算の結果が64ビットのアドレス計算を目的としている場合は、明示的にレジスタを完全な64ビットに符号拡張します。 x86-32およびx86-64アセンブリでは、次のような16ビット命令 mov ax, bx eaxの上位ワードがゼロになるこの種の「奇妙な」動作を表示しないでください。 したがって、この動作が導入された理由は何ですか?一見すると論理的に見えないようです(ただし、x86-32アセンブリの癖に慣れているためかもしれません)。

9
Visual C ++を使用してコードの背後にあるアセンブリを表示する方法は?
2行のコードの効率に関する別の質問を読んでいて、OPは、コードの背後にあるアセンブリを調べたところ、両方の行のアセンブリが同じであると述べました。余談ですが、プログラムのコンパイル時に作成されたアセンブリコードを表示するにはどうすればよいですか。 MicrosoftのVisual C ++を使用していますが、Visual Basicで記述されたコードの背後にあるアセンブリを表示できるかどうかも知りたいです。 では、C ++やVisual Basicなどの高水準言語で記述されたプログラムの背後にあるアセンブリコードをどのように表示しますか?

20
古いデスクトップコンピュータで小さなオペレーティングシステムを構築するにはどうすればよいですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問を改善する オペレーティングシステムの記述が(特に自分で)耐えられないほど複雑であることを知っているので、これは無駄かもしれません。 次のLinuxまたはWindowsをビルドする予定はありません。 私はそれが恐ろしくてバグがあり、うまくいかないことを知っています、しかしそれは大丈夫です。 Assembly、C、および(一部の)C ++で自分ですべてを書きたいと思います。 現時点では他のことで忙しくてすぐに時間がないので、これは将来のプロジェクトですが、今すぐ質問するつもりだったので、これについて多くの答えを得ることができ、ビルドして、この種のアプローチの有用なリソースになる(私が見た他のすべては、minixからのビルド、既存のブートローダーの使用、仮想ブートプログラムでのビルドなど)。 モニター、キーボード、マウスを備えた古いデスクトップの1つをセットアップし、空のハードドライブで作業を開始したいと考えています。 独自のブートローダーの記述方法を学びたい(これについては多くのリソースを見つけたが、完全を期すために、いくつかの良いものを追加してください)、独自のUSBドライバー(必要な場合)、CDドライバー(必要な場合) )などすべて、ゼロから。 コードをコンピューターに配置するにはどうすればよいですか?フロッピーディスクで行うのが最善ですか。ほとんどのコンピューターはUSBスティックからそれを行うことができますか? どのようなドライバーが必要ですか?それらを構築するための参照を提案できますか? 起動シーケンスの後-それから何ですか?プロテクトモードにするにはどうすればよいですか。 オペレーティングシステムを使用せずにメモリを管理するにはどうすればよいですか?必要なアドレスだけを使用しますか?初期化は必要ありませんか? 私は間違いなく何に遭遇しますか? コマンドラインO / SとグラフィカルなO / Sのどちらにすることができますか? グラフィカルO / Sとは何ですか?たとえば、コマンドライン、フォント、画像を上に配置するにはどうすればよいでしょうか。 マルチタスク環境のセットアップについてどこで読むことができますか?(つまり、2つのグラフィックのようなコマンドラインを並べて実行します)。 ある種のウィンドウシステムをどのように設定しますか?単純なマルチタスクが設定された後、画面にグラフィックスを表示するにはどうすればよいですか? 私を信じて、私はこれが非常に複雑なプロジェクトであることを理解し、私はおそらくそれを完了したり、それについて何かを書いたりすることは決してないでしょう。 これには、私が言及しなかった他の多くの部分があります。何か考えたら、それらも追加してください。 回答ごとに1つの「トピック」を入力してください。たとえば、USBドライバー、リソースのリスト、注意事項などです。 また、別のO / Sまたは既存のコードから構築することはお勧めしません。多くの既存のコード(Linuxカーネル、サンプルリソース、既存のドライバなど)を読み取ることはわかっていますが、最終的にはすべて自分で記述したいと思っています。私は他の何かから構築する必要があることを知っています。SOには他にも多くの質問があり、気が変わってそのルートに進んだ場合に読むことができます。しかし、これはすべてをゼロから行うことに関するものです。 それをグラフィカルにする方法について何か提案はありますか?さまざまなビデオモードとその操作方法など

6
SSEスカラーsqrt(x)がrsqrt(x)* xより遅いのはなぜですか?
私はIntel Core Duoでいくつかのコア計算をプロファイリングしており、平方根へのさまざまなアプローチを検討しているときに、奇妙なことに気付きました:SSEスカラー演算を使用すると、逆平方根を取得して乗算する方が高速ですネイティブのsqrtオペコードを使用するよりも、sqrtを取得する方が便利です。 私はそれを次のようなループでテストしています: inline float TestSqrtFunction( float in ); void TestFunc() { #define ARRAYSIZE 4096 #define NUMITERS 16386 float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 ) float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache cyclecounter.Start(); for …


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