[解決済み] movqアセンブリ機能
2022-03-02 18:51:14
質問
あるコードを読んでいて、この行が何をするのかよくわかりませんでした。
movq (%rsp), %rsp
解決方法は?
movq
(x86の話を想定して)クアッドワード(64ビット値)の移動です。この特定の命令は
movq (%rsp), %rsp
は、スタックフレームをウォークアップするコードに非常によく似ています。この命令は、現在のスタックポインタが指すクワッドワードを取得し、それをスタックポインタにロードし、上書きします。
例えば、このコードシーケンス(実際のコードに基づいており、AT&T形式ではなくインテル形式)は、スタックポインタの16バイト先の値が0になるまで、その内容から連続的にロードするものです。
576 cmpq [rsp+0x10],0x0
582 jz 594
588 movq rsp,[rsp]
592 jmp 576
594 ...
スタックフレームを歩くコードでない可能性もありますが、通常使われないことにスタックポインタを利用することになるので、珍しいと思います。
それは は スタックフレームの移動には通常スタックポインタとベースポインタが必要ですが、これは通常1レベル上がるだけ(つまり関数からのリターン)であるという点で珍しいです。
上に示したような、複数のレベルに移動するようなコードでは、おそらく、必要な場所に到達するまでスタックポインタを使用し、その後ベースポインタをポップオフする方が速いでしょう(呼び出しの慣習により、しばしば現在のベースポインタを変更する前にプッシュするので、単純なポップで古い値を回復することができます)。
関連
-
[解決済み】テスト %eax %eax のポイント【重複あり
-
[解決済み] error A2022: 命令オペランドは同じサイズでなければなりません。
-
[解決済み] 018Hと0cHは、アセンブリでは何の略ですか?具体的には「cH」と「0」「h」のプリフィックス/ポストフィックス
-
[解決済み] アセンブリ言語で数字をプリントアウトする?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] 1サイクルあたり4FLOPの理論上の最大値を達成するにはどうすればよいですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】GCCを使用して読みやすいアセンブリを作成しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜMIPS用のsubiオペコードは存在しないのですか?
-
[解決済み】単純なforループのためのMIPSアセンブリ
-
[解決済み】JNZとCMPのアセンブリ命令
-
[解決済み】アセンブリJLEのjmp命令例
-
[解決済み] アセンブリで命令セテは何をするのですか?
-
[解決済み] ARMアセンブリループ
-
[解決済み] linuxのsys_readシステムコールを作ると、レジスタeaxに何が入るのでしょうか?
-
[解決済み] アセンブリで文字列の長さを表示する方法
-
[解決済み] アセンブリ言語 - sarqはコードの中で何をするのですか?
-
[解決済み] CS:IPの組み立ての意味と仕組みについて教えてください。