問題タブ [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.
gnu-assembler - アセンブリ言語で 0 から 100 までインクリメントする
これはちょっと変わった話ですが、今日、私は GNU アセンブラーをいじっていました (少なくとも構文を読めるようにしたいのです)。つまり、0から100まで行きたいだけで、その間ずっと数字を出力しています。だから数分後、私はこれを思いつきます:
これから得られるのは、3回何度も印刷されたものだけです。私が言ったように、ほんの少し不自然な例なので、あまり心配しないでください。生死の問題ではありません。
(フォーマットは少し乱れていますが、大きな問題はありません)。
c - AT&T IA-32 Linux アセンブラー (ガス) で文字列を分割する
.asciz 文字列 1101011 を壊して最初のものを取得したいとします。どうすればいいですか?上記のコードは機能しません。49 か何かが出力されます。
linux - Linux IA-32 アセンブラー (ガス) で部分文字列を作成する
元の文字列 (文字列) から 3 つの asciz 文字の部分文字列 (ミニ文字列) を作成したい。実行中に印刷されないので、自分が何をしているのかわかりません。なぜ印刷されないのですか?ミニストリングを正しく作成していますか?
gcc - .com とはどういう意味ですか?
このプログラムを翻訳したところ、
gccプロデュースを使って組み立てる、
.com とはどういう意味ですか? dam はヒープ領域、スタック領域、またはデータ領域を使用しますか?
linux - Linux x86 GAS アセンブリでシステム コールなしでスレッドを作成することは可能ですか?
「アセンブラー言語」 (GNU をアセンブラーとして使用する x86 アーキテクチャー上の Linux) を学習している間、あははの瞬間の 1 つは、システム コールを使用する可能性でした。これらのシステム コールは非常に便利で、プログラムがユーザー空間で実行されるときに必要になることもあります。
ただし、システム コールは割り込み (およびもちろんシステム コール) を必要とするため、パフォーマンスの点でかなり高価です。つまり、ユーザー空間で現在アクティブなプログラムからカーネル空間で実行されているシステムへのコンテキスト スイッチを行う必要があります。
私が言いたいことは次のとおりです。現在、(大学のプロジェクト用に) コンパイラを実装していますが、追加したい機能の 1 つは、コンパイルされたプログラムのパフォーマンスを向上させるためのマルチスレッド コードのサポートです。 . マルチスレッド コードの一部はコンパイラ自体によって自動的に生成されるため、これにより、マルチスレッド コードのごく一部が含まれることがほぼ保証されます。パフォーマンスを向上させるには、スレッドを使用することでこれが実現することを確認する必要があります。
ただし、スレッドを使用するには、システム コールと必要な割り込みを行わなければならないのではないかと心配しています。したがって、非常に小さな (自動生成された) スレッドは、これらのシステム コールを実行するのにかかる時間の影響を大きく受け、パフォーマンスの低下につながる可能性さえあります...
したがって、私の質問は2つあります(その下に追加のボーナス質問があります):
- システムコールを必要とせずに、一度に複数のコアで同時に複数のスレッドを実行できるアセンブラコードを書くことは可能ですか?
- 本当に小さいスレッド (スレッドの合計実行時間のように小さい)、パフォーマンスの低下、またはまったく努力する価値がない場合、パフォーマンスは向上しますか?
私の推測では、マルチスレッド アセンブラ コードはシステム コールなしでは実現できないと思います。その場合でも、可能な限り効率的にスレッドを実装するための提案 (またはさらに良い: いくつかの実際のコード) はありますか?
assembly - NASMの「プッシュバイト」をGAS構文に変換する方法は?
NASMソースをGASに「移植」していて、次のコード行が見つかりました。
GASは「pushbyte」または「pushb」を許可しません。
上記のコードをGAS構文に変換するにはどうすればよいですか?
ありがとう
linux - i486-linux-gnu 命令セットの割り込みリストはどこにありますか?
学校の上級プロジェクト用にコンパイラを開発しており、AS (GNU Assembler) を使用してアセンブルしています。私のテストはすべてかなり成功しましたが、私が見た割り込みリストはどれも機能していないようで、テスト コードと一致しているようには見えませんでした。
AS のこのバージョンの関連情報:
GNU アセンブラ 2.17 Debian GNU/Linux Copyright 2005 Free Software Foundation, Inc. このプログラムはフリー ソフトウェアです。GNU General Public License の条件の下で再配布することができます。このプログラムは無保証です。このアセンブラは、「i486-linux-gnu」のターゲット用に構成されています。
gcc - gnu アセンブラ ディレクティブのドキュメント
私は現在 mips アセンブリを学ぼうとしています。そのために、私は非常に単純なCプログラムを書きました...
...そして、gcc の -S オプションを使用して mips マシンでコンパイルし、アセンブリ コードを生成します。メイン関数の先頭は次のようになります。
次に、 Gas のドキュメントを見て、これが何を意味するのかを理解しようとしましたが、これらのディレクティブは見つかりませんでした。それで、彼らはどういう意味ですか?詳細はどこで確認できますか?
nasm - Gas vs. Nasm: どのアセンブラーが最高のコードを生成しますか?
どちらのツールもアセンブリ命令を直接マシン コードに変換しますが、どちらが最も高速でクリーンなコードを生成するかを判断できますか?
c - x86、win32 での空のプログラムの GCC のアセンブリ出力
私は空のプログラムを書いて、stackoverflow コーダーを悩ませていますが、そうではありません。私はちょうどgnuツールチェーンを調べています。
以下は私には深すぎるかもしれませんが、空のプログラムの物語を続けるために、GNU が消費するものである C コンパイラの出力を調べ始めました。
test.c:
gcc -S test.c
ここで何が起こっているのか説明できますか? ここにそれを理解するための私の努力があります。as
マニュアルと最小限の x86 ASM の知識を使用しました。
.file "test.c"
論理ファイル名のディレクティブです。.def
: ドキュメント「シンボル名のデバッグ情報の定義を開始する」によると。シンボル(関数名・変数?)とは何ですか?デバッグ情報とは?.scl
: ドキュメントには、「ストレージ クラスは、シンボルが静的であるか外部であるかにフラグを付けることができます」と記載されています。これは、私が C から知っているのと同じ静的および外部ですか? そして、その「2」は何ですか?.type
: パラメータを「シンボル テーブル エントリのタイプ属性として」保存します。手がかりがありません。.endef
: 問題なし。.text
:これは問題です。セクションと呼ばれるもののようで、コードの場所であることを読みましたが、ドキュメントはあまり教えてくれませんでした。.globl
「シンボルをldに見えるようにします。」、マニュアルはこれについて非常に明確です。_main:
これは、メイン関数の開始アドレス (?) である可能性がありますpushl_
: EBP をスタックに配置するロング (32 ビット) プッシュmovl
: 32 ビット移動。疑似 C:EBP = ESP;
andl
: 論理積。Pseudo-C:ESP = -16 & ESP
、これが何を意味するのかよくわかりません。call
: IP をスタックにプッシュし (呼び出されたプロシージャが戻る方法を見つけることができるように)、現在の場所に進み__main
ます。(__main とは?)movl
: このゼロは、コードの最後に返す定数でなければなりません。MOV はこのゼロを EAX に配置します。leave
: ENTER 命令 (?) の後にスタックを復元します。なんで?ret
: スタックに保存されている命令アドレスに戻ります
ご協力ありがとうございました!