問題タブ [att]
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 - NASM 対 GAS (実際の違い)
私は Intel 対 AT&T の戦争を引き起こしようとしているわけではありません (どちらも Intel の構文をサポートしているため、問題点はあります)、またはどちらが本質的に「優れている」かを尋ねるつもりはありません。どちらかを選択する際の実際的な違いを知りたいだけです。 .
基本的に、数年前に基本的な x86 アセンブリを手に入れたとき、読んでいた本以外の理由で NASM を使用していました。それ以来、アセンブリを使用する理由がほとんどないため、GAS を試す機会がありませんでした。
どちらも Intel 構文 (個人的には好み) をサポートしており、少なくとも理論的には同じバイナリを生成する必要があることを念頭に置いてください (おそらく変更されないことはわかっていますが、意味は変更されるべきではありません)。どちらか一方?
コマンドラインオプションですか?マクロ?ニーモニックでないキーワード?または、他の何か?
ありがとう :)
gcc - GCCで生成されたasm::そのレジスタにどこに割り当てましたか?
重複の可能性:
アセンブリコードが%eaxと%edxを使用しているのに、なぜレジスタ%rdxと%raxを追加するのかわからない
すべて。だから、これが私の最小限のプログラムです:
これでgcc-Sを実行します。これが、生成されたアセンブリの要点です。
さて、あなたは私が問題の線として示した線を見るでしょう。これが私の質問です:%rdxと%raxは一体何ですか?ロードしたレジスタは%edxと%eaxだけです。
プログラムは機能するため、%rdxと%raxは、それに応じて%edxと%eaxの何らかのエイリアスである必要があります。誰かがx86レジスタの命名法のニュアンスを説明できるでしょうか?私はこれについて完全に暗闇の中にいます。
(注目すべきは、問題の行をに変更したaddl %edx, %eax
場合、結果は同じですが、に変更した場合、addl %rdx, %rax
「エラー:lサフィックスで使用されるレジスタ'%rax'が正しくありません」というメッセージが表示されます)
linux - ASM 呼び出し Printf
次の asm コードを使用して、EBXレジスタの内容を出力します。私が使うとき
そして、echo $?
最初のケースでは正しい答えが得られますが、セグメンテーション違反です。GNU アセンブラーと AT&T 構文を使用しています。この問題を解決するにはどうすればよいですか?
assembly - cmpアセンブリ言語命令-ガス形式
32ビットおよび64ビットのアセンブリ言語ファイルをgasからMASM形式に変換していますが、コード内で完全に問題があると思われる命令に遭遇しました。つまり、命令が比較を実行するためにメモリから8、16、32、または64ビットをフェッチするかどうかにかかわらず、アセンブラがオペランドのサイズを知る方法がわかりません。手順は次のとおりです。
- cmp $ 0、8(%rsp)
命令が次のいずれかであった場合、アセンブラは、レジスタに基づいてフェッチおよび比較するメモリオペランドのサイズを把握できたはずです。
- cmp%rax、8(%rsp)
- cmp%eax、8(%rsp)
- cmp%ax、8(%rsp)
命令はcmpb、cmpw、cmpl、cmpqである必要があると思っていたでしょう...しかし、いいえ、私のプログラムはcmp命令だけでそれをうまく組み立てます。残念ながら、私はこのコードが何をしているのか覚えていません、そしてそれは非常に明白ではありません...したがって、これを解決するより簡単な方法は、命令が何をしているのかを知ることです。
誰か知ってる?この構文(オペランドのサイズ/タイプが指定されていない)がイミディエートオペランドでも許可される理由を誰もが理解していますか?
assembly - このアセンブリコードは無効ですか?
次のアセンブリコードが無効かどうかを調べようとしています。
無効ですか?もしそうなら、なぜですか?ありがとう。
assembly - このアセンブリコードのCへの変換は何ですか?
ATT構文。
次のアセンブリコードが何をするのかを理解しようとしています。
これは、unsignedxという1つのパラメーターを持つ関数の本体であると想定されています。これがdo-whileループであることは知っていますが、どうすれば完全にCコードに変換できますか?
assembly - アセンブリコードからスイッチケースの値を計算する方法は?
ATT構文。
授業で話し合った練習問題を理解しようとしています。
switchステートメントに対して次の部分的なアセンブリコードが与えられました。
2番目の部分がジャンプテーブルであることを私は知っています。私が理解できないのは、元のCレベルのスイッチのケース値を計算する方法です。これどうやってするの?
assembly - このアセンブリコードは何をし、なぜそれが使われるのですか?
ATT構文。
Cのライブラリルーチンは、次のアセンブリコードのスニペットを使用することがよくあります。
- ここに格納されている%eaxの値と、それがポップされるのはなぜですか?
- このスニペットの目的は何ですか?
c++ - 関数呼び出しで%espから減算することにより、どのくらいのスペースが割り当てられますか?
C ++、ATTアセンブリ
私は次のアセンブリコードを持っています:
私の教科書は、(スタックの形成の一部として)%espから0x28を引くことにより、12バイトが変数に割り当てられると主張しています。スタックから10進数の40を引くと、12バイトが割り当てられるのはなぜですか?
assembly - cmp 0x4(%esi)、%ebxアセンブリ命令からの0x4はどういう意味ですか?
0x4
次の組立ラインからはどういう意味ですか?
この比較が等しい値を返し、ジャンプが実行されると、レジスタの値は次のようになります。
%esi
0xe944d6d0
%ebx
0xe94ceccc
そのような簡単な質問をして申し訳ありませんが、私はグーグルでそのようなparanthesis表記を検索するのに苦労しています。時間のプレッシャーの下で30分以上過ごしました。