問題タブ [inline-assembly]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
6114 参照

c - GCC インライン アセンブリ内からの syscall

インラインアセンブリブロック内からシステムコールを使用して単一の文字を書き込むことは可能ですか? もしそうなら、どのように?次のような「何か」になるはずです。

$80 は ascii の 'P' ですが、何も返されません。

どんな提案でも大歓迎です!

0 投票する
5 に答える
1929 参照

c++ - アセンブリ/SSE 乗算のヘルプ

非常に重要な数行でコードを改善する方法を見つけようとしています。

a、b、c ... はすべて float です。

SSE の使用を検討することにしましたが、改善が見られないようです。実際には、2 倍遅くなることが判明しました。私のSSEコードは次のとおりです。

標準のインライン アセンブリも使用してみましたが、SSE のように 4 つの浮動小数点をレジスタにパックできるようには見えません。

コメントやヘルプをいただければ幸いです。主に、SSE を使用した計算がシリアル C++ コードよりも遅い理由を理解する必要がありますか?

Windows XP 上の Visual Studio 2005 で、Pentium 4 と HT を使用してコンパイルしています。

前もって感謝します!

0 投票する
2 に答える
4741 参照

visual-studio - インラインアセンブラがポインタのアドレスを取得するVisualStudio

VSに関数があり、関数へのポインターを渡します。次に、ポインタをレジスタに格納してさらに操作したいと思います。どうやってそれをしますか?

私が試してみました

0 投票する
7 に答える
22424 参照

c - Cで32ビットレジスタにアクセスすることは可能ですか?

Cで32ビットレジスタにアクセスすることは可能ですか?もしそうなら、どのように?そうでない場合は、アセンブリコードをCに埋め込む方法はありますか?ちなみに、私はMinGWコンパイラを使用しています。前もって感謝します!

0 投票する
3 に答える
1658 参照

assembly - Pascal からアセンブリを実行する

Pascal からこのコードを実行するにはどうすればよいですか :

function(variable1, variable2) でメソッド/関数の引数を定義する場所。

これは学校の課題であり、Java/C++ などの代わりに Pascal/Assembly をやらせている理由がわかりません。

これは、これで助けが必要になる前に、私がたくさんの仕事をした割り当て全体ではありません。

0 投票する
1 に答える
839 参照

gcc - x86 fbstp 命令の C インライン アセンブリ

32 ビット I86 アーキテクチャで fbstp の使用をインライン化する方法を考えていました。私は何かを試しました

しかしバーは変わらない。私はこれで見つけることができるすべてを読んでみましたが、ほとんどの例は単純に 2 つの整数を足し合わせるようなことをしています。オペランドをスタックにプッシュすること、および fbstp のような命令が 80 ビットのデータをメモリに書き戻すときに何をすべきか (つまり、どの C タイプを使用するか)、および asm 構文でそれを指定する方法について話しているものが見つかりません。 .

また、x86-64 では、pushq があり、pushl はないようですが、fbstp はまだ存在しますが、fbstq は存在しません。64ビット用の他の魔法はありますか?

0 投票する
2 に答える
1715 参照

c - 64 ビットの問題: インライン アセンブリを使用して %rsp から一時変数に値をコピーしようとしています

私はオペレーティング システムの設計クラスを受講しており、C で書かれたマイクロカーネルを提供され、その上に構築しています。カーネルは 32 ビット マシンを念頭に置いて設計されているようで、私は Snow Leopard を実行しています。それでクラスの友達と私はそれを 64 ビットのアドレッシングにハックしようとしてきました。

最大の問題は、インライン アセンブリを使用して現在のスタック ポインターをディスパッチャーが使用する一時変数にコピーする 1 行のコードにあるようです。

%espは 32 ビット レジスタであるため、当然、コンパイラはエラーを吐き出します。

%rspだから私はそれを64ビットスタックポインターレジスターに置き換えました(そして、私はちょうど%spうまくいくと思います.GASは適切なプレフィックスを置くのに十分スマートであることをここのどこかで読みました)。に置き換え%espた後%rsp、次のエラーが発生します。

今、私はアセンブラの経験があまりないので、少し途方に暮れています。、およびに置き換えてみましmovlたが、何も機能しないようです。おそらくサイズが間違っているのではないかと思いますか?movmovqtemp

Temp はグローバル変数で、次のように宣言されています。

さまざまなデータ型のサイズを出力する簡単なプログラムを作成しましたが、x86-64 の void* のサイズは 8 バイトのように見えますが、これは正しいサイズであるはずですよね?

とにかく、明らかに、誰かがこの問題を解決してくれるとは思っていませんが、正しい方向に向けるヒントがあれば大歓迎です!

0 投票する
2 に答える
934 参照

x86 - すべて 1 を mmx レジスタにロードするにはどうすればよいですか? なぜこれが機能しないのですか?

検索したところ、64/32ビットに関する意見の質問以外は何も見つからなかったようです。

これらの 2 つの命令の後、私の xcode デバッガー (これは C++ のインライン asm) によると、mm2 レジスターは値 0x30500004ffffffff を保持します。今、私は x86 アセンブリに不慣れで、私のアセンブリ クラスはずっと前に取った MIPS で教えられていましたが、32 ビット モードと rbx ( ebx、bx などの 64 ビット バージョンはありませんか?) おそらく技術的には存在しません。0xffffffffful を mm2 と別のレジスタにロードして乗算するなど、すべて 1 を取得するために他の方法を試しましたが、それもうまくいかないようでした。

いくつかの SIMD 命令を使用してプラグインを最適化するように修正していますが、それを理解できないか、目を痛めないドキュメントを見つけることができないようです。どんな助けでも大歓迎です!

0 投票する
2 に答える
2534 参照

gcc - 最初のアセンブリプログラム(GCCインラインアセンブリ)でエラーが発生しました

多くのインターネット調査の後、cpuidを使用してCPUのL1キャッシュサイズを取得するために、C++プログラムに小さなアセンブラルーチンを実装しました。

MinGW(GCC、G ++)を搭載したWindows764ビットで完全に動作します。次に、GCC 4.0を使用してMacコンピューターでこれを試しましたが、プログラムがComboBoxesに奇妙な文字列を表示し、一部の信号を接続できないため、どこかにエラーがあるはずです(QtGUI)。

これは私の最初のアセンブラプログラムです。誰かが私にヒントをくれることを願っています、ありがとう!

0 投票する
7 に答える
2573 参照

c++ - アセンブリで64ビットの結果を使用した最速の階乗実装

これは宿題ではなく、私が思っていることです。したがって、ストレートコンピューティングの階乗は正確に高速ではありません。メモ化は役立ちますが、結果が32ビットまたは64ビットに収まる場合、階乗はと0を介した入力に対してのみ機能1220ます。したがって...ルックアップテーブルを使用することもできます。

したがって、インラインアセンブリを使用するインラインC ++因数分解関数が必要であり、結果として32ビットまたは64ビットの符号なし整数が期待されるとします。入力が負であるか、オーバーフローを引き起こすのに十分な大きさである場合、出力は0である必要があります。これをアセンブリで実行して、消費するサイクルを最小限に抑えるにはどうすればよいでしょうか。このコードは、64ビットのIntel/AMDアーキテクチャで実行されます。可能であれば、私は最悪のシナリオを改善することに興味があるので20!、計算にそれほど長くはかからないはずです0!-うまくいけば、バイナリ検索アプローチがあります。うまくいけば、それを行うための巧妙なトリックがありif (n == 0 || n == 1) { return 1; }ます。また、出力が32ビットである必要がある場合、アセンブリ命令にはコードとデータの両方を含めることができると思います。私のアセンブリの知識は弱いです。質問があまり意味をなさない場合は、私に知らせてください。

C ++で関数を使用できると便利ですが、より現実的な問題になります。たとえば、関数の呼び出しにコストがかかる場合、アセンブリの本体で1〜2クロックサイクルを節約しようとしてもあまり役に立ちません。