問題タブ [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 - movqアセンブリ関数
私はいくつかのコードを読んでいて、この行が何をするのかわかりませんでした:
assembly - AT&T x86 構文設計に関する質問
- AT&T 構文のすべての定数の前に「$」がある理由を誰か説明できますか?
- すべてのレジスタに「%」があるのはなぜですか?
- これは、私に多くの不完全なタイピングをさせようとする単なる別の試みですか?
- また、見つけたのは私だけ
16(%esp)
です[esp+16]
か? - 私はそれが同じものにコンパイルされることを知っていますが、なぜ誰かが必要なくたくさんの「$」と「%」を入力したいのでしょうか? - GNU がこの構文をデフォルトとして選択したのはなぜですか?
- もう 1 つのことですが、at&t 構文のすべての命令の前に : l があるのはなぜですか? -オペランドのサイズについては知っていますが、アセンブラにそれを理解させないのはなぜですか? (そのサイズではないオペランドで movl を実行したいと思うことはありますか?)
- 最後に: mov 引数が逆になっているのはなぜですか?
次のほうが論理的ではないでしょうか。
at&t は次のとおりです。
注: 荒らすつもりはありません。彼らが行った設計上の選択を理解していないだけで、なぜ彼らがそうしたのかを理解しようとしています.
c - インテル対 xmmおよびフローティング命令をアドレス指定するときのAT&T構文
みなさん、こんにちは。私はアセンブリプログラムの作成に取り組んでいます。xmmとfpに対処するときの、AT&TとIntelの構文の外観を始める前に、ある程度の知識を習得したいと思います。通常の命令では、バイトの関数がAT&Tでは「pushb」であるのに対し、Intelでは「pushbyte」であることがわかっています。xmmまたはfpを使用する場合と同様の比較を誰かが提供できますか?要約すると、xmmオペランドがどのようにアドレス指定されるかを知りたいです。よろしくお願いします。
assembly - アセンブリX64関数内の構造体フィールドへのアクセス
アセンブリ関数内の構造体フィールドに直接アクセスすることは可能ですか?また、アセンブリを介してグローバル変数にアクセスするにはどうすればよいですか?
Intel構文のインラインアセンブリでは、次のことができます。
ATT構文(gcc)を使用してアセンブリx64関数(インラインではない)でこれを行うにはどうすればよいですか?それが不可能な場合は、インライン関数でこれを行うにはどうすればよいですか?
assembly - アセンブリ関数へのポインターの受け渡し
私はアセンブリプログラミングにかなり慣れていません。GCC (Linux) で x86 プラットフォームを使用しています。
C から次のように呼び出したい関数があります。
この関数は、s1 と s2 のメモリ位置を取得してそれらを比較し、インクリメントと比較などを行いながら、いくつかの処理を行います。これは memcmp のようなものですが、私はもっとやっています。
私の質問:アセンブリ関数にポインタを渡すと? では、「このメモリ アドレスに格納されている値を教えてください」と言うにはどうすればよいでしょうか。
これが私がこれまでに持っているものです:
スタックから最初の関数 arg ("s1") を取得するには、次のようにします (someaddress は 32 ビット整数で、私は 32 ビット プロセッサで作業しています)。
(またはなど)に入れsomevar
、で printf すると、そのアドレスと、渡した unsigned char ポインタ " " のアドレスが同じであることがわかります。しかし、私が実際に行ったことは、メモリアドレスを取得し、それを整数に変換してから、その整数をいくつかのアドレスに入れたことだと思います。%eax
%ebx
%p
s1
たとえば、次のようにすると:
「エラー: `cmp' のメモリ参照が多すぎます」というメッセージが表示されます。「あなたが台無しにした」以外は、それが何を意味するのか完全にはわかりません;-)
そう...
- ポインターを渡し、ポインターとして保持する方法は?
- アセンブリでそのポインタの値を使用する方法は? (例えば、
*ptr
C のように)
LEA オペランドを見たいですか?
私は Richard Blum の "Professional Assembly Programming" をガイドとして使用していますが、Blum はこのケースを扱っていないようです。
アップデート
勉強になる回答ありがとうございます!
残念ながら、私はまだ逆参照できません。
簡単な例を次に示します。アセンブリ関数はポインターを受け取り、それをエコー バックする必要があります。代わりに私は得る:
C プログラム:
組み立てプログラム:
assembly - g++ が使用する ASM スタイル
g++ が使用する ASM スタイル (AT&T または Intel) を知りたいと思っていました。さまざまな ASM 命令の定義を提供する必要がある課題に取り組んでいます。私は以下を見ました:
インテルのスタイルでは、上記は次のようになります。
しかし、ベース ポインターをスタック ポインターに移動するのは意味がなく、g++ が AT&T ASM スタイルを使用するかどうか疑問に思います。
ASM (およびプラットフォーム情報) を生成するために使用したコマンドは次のとおりです。
私の質問: g++ が生成しているスタイルを明確に伝える方法はありますか? なんらかのスイッチはありますか。
私が間違っているところを修正してください。前もって感謝します!
assembly - mov 0、%eax の x86 アセンブリでのセグメンテーション違反
x86コードの小さな部分を組み立てようとしています。私は 32 ビット マシンを使用しており、次のコードを記述しました。値を eax に追加してから返す必要があります。出力がないことを認識しています。これを使用してコンパイルすると
gcc main.S -o main
エラーなしでコンパイルされます。しかし、それを実行すると、セグメンテーション違反が発生します (gdb は、最初の movl 命令でセグメンテーション違反が発生すると主張しています)。main.S には次のコードが含まれています。私は何を間違っていますか?
assembly - x86アセンブリのmov命令
私が読んだことからmov
、それは2番目の引数を最初の引数にコピーします。では、これは何をするのでしょうか?
edxにあるものはすべて関数の最初のパラメーターにコピーされます(からのオフセットが+8ebp
のパラメーターであるため)?
これが本当に意味するのは、最初のパラメーターをedx
レジスターに移動することだと思いますが、ウィキペディアでそれが逆であると読みましたか?
assembly - cltq はアセンブリで何をしますか?
実際、私のプログラムは次のように単純です。
しかし、アセンブリの出力はかなり長いです:
私が理解していないのは、このブロックです:
assembly - `movl(%eax)、%eax`の括弧はどういう意味ですか?
私は十分にグーグルで検索しましたが、角かっこが何()
を意味するのか理解できませんでした。また、私はいくつかの構文を次のように見ていますmovl 8(%ebp), %eax
誰かが私にいくつかの良い参考文献を提案できますか?Googleの上位20件の結果から何も見つかりませんでした。