問題タブ [gnu-assembler]

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 投票する
1 に答える
18418 参照

x86 - x86アセンブラ:浮動小数点比較

コンパイラプロジェクトの一環として、浮動小数点値を比較するためにx86用のGNUアセンブラコードを作成する必要があります。私はこれをオンラインで行う方法に関するリソースを見つけようとしましたが、私が理解していることから、次のように機能します。

比較したい2つの値が浮動小数点スタック上の唯一の値であると仮定すると、fcomi命令は値を比較し、CPUフラグを設定して、、、、...je命令を使用できるようにします。jnejl

これはたまにしか機能しないので、私は尋ねています。例えば:

「Hallo」は印刷されるべきだと思いますが、印刷されません。f1とf2を切り替えても、印刷されません。これは論理的な矛盾です。ただし、正常に機能しているようですjejne

私は何が間違っているのですか?

PS:fcomipは1つの値だけをポップしますか、それとも両方をポップしますか?

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

gcc - x86_64 "gcc -S" -> as -> ld -> 実行失敗

x86_64 プラットフォームで "gcc -S" -> "as" -> "ld" によって簡略化された C ソース ファイルをコンパイルしようとしています。

プロセスはエラーなしで終了しましたが、実行すると「No such file or direcotry」というエラー メッセージが表示されます。

また、いくつかのGoogleの結果に記載されているように、動的リンクを追加しようとしました.

しかし、エラーは残りました。

コメントや提案をお待ちしております。

編集: Linux ボックスに /lib64/ld-linux.so.2 が存在しないというミスを犯しました。/lib64/ld-2.9.so を使うべきでした。指定された存在しないライブラリ ファイルで ld がエラーを報告しないことを知りませんでした。

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

assembly - ガスマクロでxmmレジスタ名を自動的に生成しますか?

パラメータ n に応じて xmm レジスタへのさまざまな movdqu 命令を含むコードを生成するガス マクロを作成したいと考えています。

コンパイルすると、逆アセンブルされたコードは、

しかし、上のxxmovマクロで%xmm0を%xmm\nに置き換えたらコンパイルエラーになり、

とにかく、マクロを xmm レジスタ名 (%xmm0 から %xmm_{n-1} まで) に操作できますか? http://sourceware.org/binutils/docs/as/Macro.html#Macroに記載されている \@ (%xmm\@) を試しました。ただし、このマクロを複数回使用したいのに、 \@ が単調に増加しているように見えるため、うまく機能しませんでした..

0 投票する
4 に答える
22717 参照

assembly - gnuアセンブリでの.byteアセンブラディレクティブの使用は何ですか?

インラインアセンブリを含むいくつかのCコードを調べているときに、.byte(先頭にドットが付いている)ディレクティブに出くわしました。

Webでアセンブリ参照を確認したところ、メモリに1バイトを予約するために使用されていることがわかりました。

しかし、コードにはステートメントの前にラベルがありませんでした。そのため、ラベルのない.byteディレクティブやその他のデータストレージディレクティブをどのように使用するのか疑問に思いました。

たとえば、コードを記述した場合.byte 0x0a、どのように使用できますか?

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

linux - このコードスニペットを理解するのに役立ちます

これは、カーネルコードのheader.Sファイルからのコードスニッパーです。lretw指示が何をするのか理解できませんでした。指示については、非常に多くのオンラインソースをチェックしました。

誰かがこの指示を理解するのを手伝ってくれますか?

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

gcc - DOSのタイマー割り込みハンドラーをGNU(GCCおよびGAS)に置き換える

タイトルが示すように、DOSのタイマー割り込みの既存のハンドラーを自分のものに置き換えようとしています。さまざまなソリューションを幅広く検索した後、まさにそれを実行するアセンブリコードを見つけました。それをコンパイルしてテストすることもでき、それが機能することを確認しました。

ここでの問題は、私が見つけたコード(以下を参照)がTASM用に記述されていることです。これを、GCCでコンパイルする作成中のCコードで使用したいと思います。

コードをGAS(GNUアセンブラ)構文に変換しようとしましたが、機能しないようです(何度も試行したときに、ほとんどの場合、何らかのクラッシュが発生しました)。

誰かが私に解決策を教えてくれたらとてもありがたいです(GASがコンパイルできるアセンブリコードの動作バージョンであっても、Cですべてを実行する方法-"interrupt"キーワードは機能しません、また、「属性((割り込み))」なども、TASMとGCCの間を橋渡しする方法もありません。

また、私が使用しているDOSシステムは、実際にはFreeDOSがインストールされた仮想マシンを実行しているOracleVM VirtualBox Managerであり、Cに使用しているコンパイラはDJGPP開発環境で提供されるGCCです。 。

これは私が持っている動作中のTASMコードです(http://www.programmersheaven.com/mb/x86_asm/276128/276185/re-redefining-the-timer-interrupt-handler/から取得):

それは私のマシンで完全に動作します。プログラムを起動すると、コンソールの最初の行全体が、常に変化するカラフルな文字に置き換えられているのがわかります。

そして、これは上記のコードをGAS構文に変換する私の試みです。

次のコマンドを使用してファイル(「ttv2.s」と呼ばれる)をコンパイルします。

結果のEXEファイルを実行すると(アセンブリおよびリンケージ中に警告やエラーは発生しません)、プログラムは「リング0の例外0D(および多数のレジスタ値)」というエラーでクラッシュします。ただし、TASMバージョンは問題なく動作します。したがって、コードを変換する方法、または最終的なEXEを作成する方法のいずれかに問題があると推測しています。または両方。

少しの追加情報、それが何らかの形で役立つ場合:

  • インストールコマンド( )を削除int $0x21してもクラッシュは発生せず、プログラムはキーを押すのを待ってから終了します。
  • インストールコマンドを保持しているが、キー待機コマンド( )を削除するint $0x16と、プログラムはすぐに終了し、クラッシュは発生しません。
  • インストールコマンドを保持し、wait-for-keyコマンドをアクティブな遅延ループ(40億回の反復の単純なループ)に置き換えると、wait-for-keyコマンドが配置されたときと同じようにプログラムがクラッシュします。 、しかし、すぐにではなく、数秒後。
  • どちらの場合も(キーを押すか遅延して)クラッシュすると、2つのインストールコマンドの1つだけを削除しても、プログラムがクラッシュします。

あらゆる支援を事前に感謝し、長い投稿をお詫びします...

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

assembly - GAS: .cfi_def_cfa_offset の説明

GCC で生成されたアセンブリの .cfi_def_cfa_offset ディレクティブで使用される値について説明が必要です。.cfi ディレクティブが呼び出しフレームとスタックの巻き戻しに関与していることは漠然と知っていますが、たとえば、次の C プログラムをコンパイルする際に、GCC が出力するアセンブリで値 16 と 8 が使用されている理由について、より詳細な説明が必要です。私の64ビットUbuntuマシンで。

C プログラム:

次のように、ソース ファイル test.c で GCC を呼び出しましたgcc -S -O3 test.c。-O3 によって非標準の最適化が可能になることはわかっていますが、簡潔にするために、生成されるアセンブリのサイズを制限したかったのです。

生成されたアセンブリ:

生成されたアセンブリで .cfi_def_cfa_offset ディレクティブに値 16 と 8 が使用されるのはなぜですか? また、ローカル関数の開始ラベルと関数終了ラベルに 22 という数字が使用されているのはなぜですか?

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

linux - ガス中のコマンドライン引数の取得

GASの最初のコマンドライン引数の最初の文字を取得する方法を見つけるのに苦労しています。ここで私がNASMでどのようにそれを行うかを明確にするために:

編集:AT&T構文への文字通りの変換とGASでのコンパイルは、期待される結果を生成しません。EBX値は文字として認識されません。

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

assembly - '.set noat' は MIPS アセンブリでサポートされていませんか?

現在、私は GNU as を学んでおり、"info as" で多くの有用な情報を見つけています。

".set noat" が MIPS 指定のコードで使用されていることがわかりましたが、"info as" でこのディレクティブを検索すると、ノード "alpha ディレクティブ" でその説明が見つかりましたが、"MIPS Dependent Features" では見つかりませんでした。なんで?マニュアルで何かを見逃しましたか?

ティア

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

assembly - アセンブラ関数の間違った戻り値 (x86)

アセンブラーのプログラミングには Intel x86 を使用しています。2 つの変数 (int) があり、アセンブラー関数が最大のものを返すようにします。私は C プログラムでアセンブラ関数を呼び出し、これを main() 関数 (1,5) に入れました。

アセンブラコードは次のとおりです。

最大数は %eax (movl var2, %eax) になります。問題は、関数が常に %eax で最初の数値を返すことです。たとえば、function(1,5) は "5" ではなく "1" を返します。

結果が間違っている理由がわかりません。

編集:あなたの返信のおかげで、私はあなたのアドバイスのおかげでプログラムを修正しました:

に戻るにfunction()は を使用しますjmpが、正しいですか? それは正常に動作します。

また、このコードを改善するにはどうすればよいですか? 変数を使用するのは、目的が 3 つの数値を持ち、中央値を見つけることだからです。