1. ホーム
  2. assembly

[解決済み] 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レベル上がるだけ(つまり関数からのリターン)であるという点で珍しいです。

上に示したような、複数のレベルに移動するようなコードでは、おそらく、必要な場所に到達するまでスタックポインタを使用し、その後ベースポインタをポップオフする方が速いでしょう(呼び出しの慣習により、しばしば現在のベースポインタを変更する前にプッシュするので、単純なポップで古い値を回復することができます)。