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

x86は、Intel 8086 CPUから派生したアーキテクチャーです。x86ファミリには、32ビットのIA-32アーキテクチャと64ビットのx86-64アーキテクチャ、およびレガシー16ビットアーキテクチャが含まれています。後者に関する質問には、[x86-16]や[emu8086]のタグを付ける必要があります。質問が64ビットx86-64に固有の場合は、[x86-64]タグを使用します。x86 FPUの場合、タグ[x87]を使用します。SSE1 / 2/3/4の場合、AVX *も[sse]を使用し、[avx] / [avx2] / [avx512]のいずれかを適用します

2
%演算子よりも速い分割可能性テスト?
コンピューターに不思議なことに気づきました。*手書きの分割可能性テストは、%オペレーターよりも大幅に高速です。最小限の例を考えてみましょう: * AMD Ryzen Threadripper 2990WX、GCC 9.2.0 static int divisible_ui_p(unsigned int m, unsigned int a) { if (m <= a) { if (m == a) { return 1; } return 0; } m += a; m >>= __builtin_ctz(m); return divisible_ui_p(m, a); } 例は奇数aとによって制限されm > 0ます。ただし、すべてのaおよびに簡単に一般化できますm。コードは除算を一連の追加に変換するだけです。 でコンパイルされたテストプログラムを考えてみましょう-std=c99 -march=native -O3: for (unsigned …

1
なぜGCCは配列の初期化を集約して、最初にゼロ以外の要素を含めて全体をゼロで埋めるのですか?
なぜgccは残りの96個の整数だけではなく、配列全体をゼロで埋めるのですか?ゼロ以外の初期化子はすべて配列の先頭にあります。 void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1とgcc9.2はどちらもこのようにasmを作成します(Godboltコンパイラエクスプローラー)。 # gcc9.2 -O3 -m32 -mno-sse bar(): push edi # save call-preserved EDI which …

1
.COMファイルをロードした後、DOSがSPレジスタを0xFFFEに設定するのはなぜですか?
.COMファイルに関するwikpediaページhttps://en.wikipedia.org/wiki/COM_fileには次のように記載されています。 DOSの.COMファイルは、すべてのx86セグメントレジスタを同じ値に設定し、SP(スタックポインタ)レジスタを0xFFFEに設定するため、スタックはメモリセグメントの最上部から始まり、そこから下に向かって動作します。 しかし、これは実際にはスタックをセグメントの先頭の1ワード下から開始するように設定します。スタックに値をプッシュすると、CPUはSPを0xFFFCにデクリメントしてそこに値を格納するため、セグメントのトップワードが無駄になります。DOSがSPを代わりに0に設定しない理由は何ですか?


2
分解されたバイナリ爆弾フェーズ3のロジックを理解する難しさ
バイナリ爆弾ラボから次のアセンブリプログラムがあります。目的は、explode_bomb関数をトリガーせずにバイナリを実行するために必要なキーワードを決定することです。このプログラムのアセンブリの分析についてコメントしましたが、すべてを一緒に結合するのに問題があります。 必要な情報はすべて揃っていると思いますが、それでも実際の根本的なロジックを確認できず、行き詰まっています。どんな助けにも感謝します! 以下は、逆アセンブルされたプログラム自体です。 0x08048c3c <+0>: push %edi 0x08048c3d <+1>: push %esi 0x08048c3e <+2>: sub $0x14,%esp 0x08048c41 <+5>: movl $0x804a388,(%esp) 0x08048c48 <+12>: call 0x80490ab <string_length> 0x08048c4d <+17>: add $0x1,%eax 0x08048c50 <+20>: mov %eax,(%esp) 0x08048c53 <+23>: call 0x8048800 <malloc@plt> 0x08048c58 <+28>: mov $0x804a388,%esi 0x08048c5d <+33>: mov $0x13,%ecx 0x08048c62 <+38>: mov %eax,%edi 0x08048c64 …

1
vzeroallゼロはymm16からymm31を登録しますか?
のドキュメントにvzeroall一貫性がないようです。散文は言う: 命令は、すべてのXMMまたはYMMレジスタの内容をゼロにします。 ただし、その下の疑似コードは、64ビットモードではレジスターymm0からのみymm15影響を受けることを示しています。 IF (64-bit mode) limit ←15 ELSE limit ← 7 FOR i in 0 .. limit: simd_reg_file[i][MAXVL-1:0] ← 0 AVX-512をサポートするマシンymm15では、ymm16までymm31存在するため、「すべて」をクリアするのと同じではありません。 散文または疑似コードは正しいですか?
8 assembly  x86  intel  avx  avx512 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.