問題タブ [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.
assembly - インラインアセンブリの「call」命令の引数として文字列をどのように渡しますか?
基本的に、私は次のようなことができるようにしたいと思います。
基本的には、名前が文字列に格納されている関数を呼び出したいと思います。これを行うための適切な構文は何でしょうか?
編集:x86アセンブリについて話している
gcc - GCCスタイルの拡張インラインasmで、「仮想化された」ブール値、たとえばキャリーフラグを出力することは可能ですか?
2つの128ビット符号なし整数をインラインamd-64asmと比較する次のC++コードがある場合:
次に、非常に効率的にインライン化されますが、1つの欠陥があります。戻り値は、値が0または1の汎用レジスタの「インターフェイス」を介して行われます。これにより、2つまたは3つの不要な余分な命令が追加され、完全に最適化される比較操作が損なわれます。生成されたコードは次のようになります。
「bool」の戻り値を持つ「setc%0」の代わりに「int」の戻り値を持つ「sbb%0、%0」を使用する場合でも、2つの追加の命令があります。
私が欲しいのはこれです:
それ以外の場合、GCC拡張インラインasmは素晴らしいです。しかし、あらゆる点で、組み込み関数と同じくらい優れていることを望んでいます。ブール値を汎用レジスタに「レンダリング」することなく、CPUフラグの状態の形式で直接返すことができるようにしたいと考えています。
これは可能ですか、それともGCC(およびこの形式のインラインasmの使用も可能にするIntel C ++コンパイラ)を変更するか、リファクタリングする必要がありますか?
また、私がそれに取り組んでいる間、比較演算子の定式化を改善できる他の方法はありますか?
x86 - インライン アセンブリから呼び出すときに C++ 関数に引数を渡す方法
したがって、C++ dll から関数を呼び出せるようにしたいと考えています。特定の理由から、C++ コードの __asm ブロックからそれらを呼び出したいと考えています。私の質問は次のとおりです。関数を呼び出す前に、関数の呼び出し規則で指定された順序で引数をスタックにプッシュする必要があることはわかっています。
私が心配しているのは、アセンブリの標準のワード サイズが 2 バイトであるのに対し、C++ の int のサイズは通常 4 バイトであり、double の場合は 8 バイトであることを覚えているように見えるという事実です。各変数の完全な値をプッシュしますか、それとも最初の数バイトだけをプッシュしますか? 上記のコードが正しくない場合、正しい方法は何でしょうか? また、呼び出している関数が double を返す場合、この値はどこに保存されますか? 32ビット(4バイト)しか保存できないため、レジスタに入れることはできないと思います。この混乱の助けがあれば大歓迎です:)
c - MinGW インライン アセンブリの「エラー: 不明なラベルへの後方参照...」
もう一度、MinGW インライン アセンブリで遊んでみます。
それをコンパイルします。
C:\Users\Andre\Codes>gcc asmtest.c -o asmtest -masm=intel
エラーがあります:
C:\Users\Andre\AppData\Local\Temp\ccqny4yb.s: アセンブラー メッセージ: C:\Users\Andre\AppData\Local\Temp\ccqny4yb.s:53: エラー: 不明なラベルへの後方参照 "110:"
ここで何が問題なのですか?私のコードはすでに有効だと思いますか?
gcc - 「__asm__(".previous");」とは 平均?
mingw 4.4 でサードパーティのヘッダーを使用するプロジェクトをコンパイルしようとすると、次のエラーが発生しました。
アセンブラー メッセージ:
エラー: 行末のジャンク、認識されない最初の文字は '"'
エラー: 不明な疑似操作: '.previous'
含まれているヘッダーの 1 つの末尾に、次のコードが見つかりました。
私はインライン アセンブラ命令の経験がまったくないので、その説明をグーグルで検索しましたが、私の 2 つの基本的な質問に対する答えが見つかりませんでした。実際には何をし__asm__(".previous");
ているのか、なぜこれをヘッダーファイルの最後に置くのでしょうか。
これらは、__asm__
プロジェクト全体で唯一の指示です。それらを安全に削除できますか? または、既知の疑似操作にするために .previous を定義する方法はありますか?
教えてください!
c++ - アセンブリなしの C/C++ 関数定義
printf()
のような関数は、最後のステップで、インライン アセンブリを使用して定義されていると常に考えていました。stdio.h の奥深くには、実際に CPU に何をすべきかを伝える asm コードが埋め込まれています。たとえば、DOS では、 teruptmov
を呼び出すよりも、最初に文字列の先頭をメモリ ロケーションまたはレジスタに ing することによって実装されたことを覚えています。int
しかし、Visual Studio の x64 バージョンはインライン アセンブラをまったくサポートしていないため、C/C++ にアセンブラ定義の関数がまったくないのはなぜだろうと思いました。printf()
アセンブラ コードを使用せずに C/C++ で実装されるようなライブラリ関数はどのようになりますか? 適切なソフトウェア割り込みを実際に実行するのは何ですか? ありがとう。
c - GCCでアセンブリを呼び出していますか?
このコードが正確に何をするのか教えてもらえますか? つまり、このコマンドのアイデアまたは一部を持っているということです。"1" newval は入力、"=a" は以前の値をフラッシュして更新することです。「m」はメモリ操作用ですが、この関数の機能について混乱しています。「+m」記号は何をしますか? この関数は m=a; のようなことをしますか? m = newval; 返す
c++ - 32 ビットから 64 ビットへのインライン アセンブリの移植
関数ポインターをロードし (それがどのように機能するかは問題ではありません)、いくつかの引数をいくつかのインライン アセンブリでスタックにプッシュし、その関数を呼び出します。コードは次のようになります。
何らかの形で追加したい
しかし、私は64ビットマシンのインラインアセンブリを知りません.誰かが私を助けることができますか?
ありがとう
c - スタックに保存された値を決定する方法は?
私はいくつかの実験を行っており、システムコール中にスタックに保存されているもの (ユーザーランドプロセスの保存された状態) を確認できるようにしたいと考えています。http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.Sによると、レジスタのさまざまな値がスタック ポインタの特定のオフセットに保存されていることがわかります。これは、スタックに保存されているものを調べるために使用しようとしているコードです (これは、私が作成したカスタム システム コールにあります)。
value は unsigned long です。
現時点では、この値は予期されたものではありません (ds のユーザー値として 0 が保存されていることが示されています)。
スタック ポインターのオフセットに正しくアクセスしていますか?
別の可能性として、GDB などのデバッガーを使用して、カーネル内でスタックの内容を調べることはできますか? 私はデバッグにあまり詳しくなく、カーネル内のコードをデバッグする方法がわかりません。どんな助けでも大歓迎です。
programming-languages - 編集とコンパイル/実行を一緒にできるプログラミング言語はありますか?
コードを書くときは、常にユニットの小さな断片を書き、頻繁にコンパイルします。これにより、すべてが正しく実行されていることを確認できますが、非常に時間がかかります。コーディングと実行を同時に並行して行うことをサポートできるプログラミング言語はありますか? つまり、キーを押して有効なコードが表示されるとすぐに、編集の効果が実行中のプログラムに組み込まれます。