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

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

2
スパース下三角線形システムの後方解決の最適化
主対角線上にゼロがあるnxn下三角行列Aの圧縮スパース列(csc)表現があり、bを (A + I)' * x = b これは私がこれを計算するために持っているルーチンです: void backsolve(const int*__restrict__ Lp, const int*__restrict__ Li, const double*__restrict__ Lx, const int n, double*__restrict__ x) { for (int i=n-1; i>=0; --i) { for (int j=Lp[i]; j<Lp[i+1]; ++j) { x[i] -= Lx[j] * x[Li[j]]; } } } したがって、bは引数を介して渡さxれ、ソリューションによって上書きされます。Lp、Li、Lxそれぞれスパース行列の標準CSC表現の行、インデックス、及びデータポインタです。この関数はプログラムの一番上のホットスポットで、次の行があります。 x[i] -= Lx[j] * …

2
スプライトをレンダリングするC64アセンブリ
私は、Ca65アセンブラとld65リンカを使用して、Commodore 64用の6502アセンブラで短いプログラムを作成しました。プログラムは、ディスプレイの中央近くのどこかで塗りつぶされた正方形のスプライトをレンダリングする必要がありますが、何もレンダリングされていません。 これは私のアセンブリです: .segment "CODE" ; set sprite pointer index ; this, multiplied by $40, is the address ; in this case, the address is $2000 ; $80 * $40 = $2000 lda #$80 sta $07f8 ; enable sprite 0 lda #$01 sta $d015 ; set x and y position …

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 

2
最速のポーリングループ-1 CPUサイクルをトリミングするにはどうすればよいですか?
ARM Cortex M3(STM32F101と同様)のリアルタイムアプリケーションでは、内部ペリフェラルのレジスタのビットをゼロになるまでポーリングし、ループをできるだけタイトにします。ビットバンディングを使用して適切なビットにアクセスします。(動作する)Cコードは while (*(volatile uint32_t*)kMyBit != 0); そのコードは、オンチップ実行可能RAMにコピーされます。手動で最適化した後²、ポーリングループは次のようになり、6サイクルに設定しました。 0x00600200 681A LDR r2,[r3,#0x00] 0x00600202 2A00 CMP r2,#0x00 0x00600204 D1FC BNE 0x00600200 ポーリングの不確実性をどのようにして下げることができますか?5サイクルのループは私の目標に適合します。ゼロになった後、同じビットを15.5サイクルにできるだけ近づけてサンプリングします。 私の仕様では、少なくとも6.5 CPUクロックサイクルの低パルスを確実に検出することを求めています。持続時間が12.5サイクル未満の場合、確実に短いと分類します。そして、それが18.5サイクル以上続く限り、確実に分類します。パルスには、CPUクロックとの位相関係が定義されていません。これは、私の唯一の正確なタイミング基準です。これには、最大で5クロックのポーリングループが必要です。実際、私は5クロックサイクルでポーリングできる数十年前の8ビットCPUで実行されるコードをエミュレートしており、それが仕様になっています。 ループの前にNOPを挿入することでコードアライメントをオフセットしようとしましたが、多くのバリエーションで試しましたが、変化は見られませんでした。 CMPとLDRを反転させようとしましたが、それでも6サイクルが得られます。 0x00600200 681A LDR r2,[r3,#0x00] ; we loop here 0x00600202 2A00 CMP r2,#0x00 0x00600204 681A LDR r2,[r3,#0x00] 0x00600206 D1FC BNE 0x00600202 これは8サイクルです 0x00600200 681A LDR …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.