問題タブ [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.
c - ベース ポインターとスタック ポインターを理解する: gcc 出力のコンテキストで
次のCプログラムがあります。
そして、gcc で -S ディレクティブを使用してコンパイルすると、次のアセンブリが得られます。
私が理解していないのは、以前の配列要素がbpから離れているのはなぜですか? 配列の要素が逆の順序で配置されているようです。
また、配列要素をスタックにプッシュするために、gcc が movl の代わりに push を使用しないのはなぜですか?
別の見方
私が得るモジュールへの静的変数として配列をグローバル名前空間に移動します:
次の C プログラムを使用します。
これはスタックへのより多くの洞察を与えません。しかし、わずかに異なるセマンティクスを使用したアセンブリの差分出力を見るのは興味深いことです。
assembly - GNUアセンブラ(as)を使用してアセンブリファイルを生のバイナリ(DOS .comなど)形式にコンパイルするにはどうすればよいですか?
このソースコードをWindowsでコンパイルしたい(これは単なる例です):
NASMまたはFASMでコンパイルすると、出力ファイルの長さは2バイトになります。しかし、GNUアセンブラでコンパイルすると、出力ファイルの長さは292バイトになります。
GNUアセンブラ(as)を使用してアセンブリファイルを生のバイナリ(DOS .comなど)形式にコンパイルするにはどうすればよいですか?
なぜ私はこれをするのですか?
独自のシンプルなOSを作成したいので、Cを使用してコードを作成し(stdio.hやmath.hでもC標準ライブラリを使用せずに)、アセンブリに変換します。
次に、アセンブリファイルを生のバイナリにコンパイルします。
次に、名前をa.out
(アセンブラーの出力)に変更しmy_os.flp
、最後にVMWareでOSを起動します:)
linux - x86_64アセンブリLinuxシステムコールの混乱
私は現在、Linuxでアセンブリ言語を学んでいます。私は「ProgrammingFromtheGround Up」という本を使用してきましたが、すべての例は32ビットです。私のOSは64ビットで、すべての例を64ビットで実行しようとしています。しかし、私は問題を抱えています:
これは単にLinuxのexitSystem呼び出しを呼び出すだけであるか、そうすべきです。代わりに、SEG FAULTが発生し、代わりにこれを行うと
できます。明らかに問題は、%raxに移動する値です。2番目の例で使用する値$1は、「Programming From the Ground Up」が使用すると言ったものですが、インターネット上の複数のソースによると、64ビットのシステムコール番号は$60です。参照 私は何が間違っているのですか?また、他にどのような問題に注意する必要があり、参照用に何を使用する必要がありますか?あなたが知る必要がある場合に備えて、私はゼロからのプログラミングの第5章にいます。
c - Linux 64ビットでのCとアセンブリ(32ビットコード)の組み合わせ
私は64ビットのUbuntuオペレーティングシステムを使用しており、32ビットのアセンブリを学習しています。私はこれらの2つのファイルをコンパイルしようとしています:
square.s:
main.c:
32ビット仮想マシンで、このコマンドを使用してコンパイルしました
そしてそれはうまくいった。私が抱えている問題は、これらのファイルを64ビットマシンでコンパイルしたいということです。これらのファイルをコンパイルするいくつかの方法を試しましたが、どれもうまくいきませんでした。誰かが私を正しい方向に向けることができますか?これを行うオプションはありますか?-m32を試しましたが、うまくいきませんでした。
私がこれをするとき:
私はこれを手に入れます:
assembly - GNU GASアセンブリの現在のアドレスを表す記号はありますか?
NASMの例のように、同じことを実現するための特別なGAS構文があるかどうか知りたいです。
$
特に、現在の住所を表す記号に興味があります。
assembly - GASには、NASMの$トークンと同様に評価されるものがありますか?
私は議会の道を歩み始めたばかりで、最初の「Hello、World!」の1つです。私が見つけたチュートリアルhttp://asm.sourceforge.net/intro/hello.htmlは、システムコールに入力する文字列の長さを疑似動的に取得するための優れた方法を提供します。
これはnasmでうまく機能し、すべてが問題なく組み立てられ、リンクされ、実行されます。
問題は、私がガスで同じことをする方法を見つけようとするときに起こります。
この場合の$は、現在のアセンブリ位置http://www.csie.ntu.edu.tw/~comp03/nasm/nasmdoc3.html#section-3.5に評価されるトークンであることを理解しています。
この表現($ --msg)はガスで表現できますか、それともこのnasm専用のシンタックスシュガーですか?
debugging - デバッグ目的の gcc と as-ld 、gdb ブレークポイントでヒットしない
私のプラットフォームはubuntu i686(32ビット)です
デバッグ オプションを使用して gcc ドライバーを使用してアセンブリ ソースをコンパイルする場合:
emacsエディターに統合されたgdbデバッガーでtoupper実行可能ファイルを開きます
最初の命令でブレークポイントを生成しました
run コマンドで実行を開始すると、デバッガーは _start ラベルで正しく停止します。
同じソース toupper.s を as アセンブラーでコンパイルし、ld リンカーでリンクすると、次のようになります。
これで、デバッグの手順が gcc のケースと一致しました。
シンボル テーブルは正しく、ブレークポイントは正しいことを示していますが、実行は段階的に行われていません。
gcc ケースで詳細な手順を表示し、as/ld ケースで再試行しましたが、結果は同じです
as/ld ケースと一致しない gcc ケースのデフォルト オプションがありますか?
前もって感謝します
assembly - GNU アセンブラーのコンパイル エラー「インライン asm のオペランドが無効です」
ターゲットをARMプラットフォームとして、GNUアセンブラーを使用してアセンブリコードをコンパイルしようとしています。しかし、いくつかのエラーが表示されます。アセンブリ文法に慣れていません。
誰でもこのエラーを回避する方法を教えてもらえますか?
このコンパイル エラーの原因となったインライン asm コードは次のとおりです。
assembly - asm命令「ldr」と「ldr_post」の違いは何ですか?
最新のffmpegをiOSプラットフォームに移行しようとすると、いくつかのコンパイルエラーが発生しました。これらのエラーは、最新のffmpegで一部のasm命令を処理できないように見えるGNUアセンブラ(gas)から発生しました。
例えば:
ただし、命令'ldr_post'は、以前のバージョンのffmpeg(より具体的にはバージョン0.7)にはありません。
私の質問は、「ldr_post」と「ldr」の違いは何ですか?これらのコンパイルエラーを回避するために、「ldr_post」をいくつかのより単純な命令の組み合わせに変更できますか?