質問
私はいくつかのコードを読んでいたが、この行が何をするのかわからなかった:
movq (%rsp), %rsp
解決
movq
(x86について話していると仮定して)は、四角語(64ビット値)の動きです。この特定の指示:
movq (%rsp), %rsp
スタックフレームを通り抜けるコードに非常によく似ています。この特定の命令は、現在のスタックポインターによって指された四角形をつかみ、それをスタックポインターにロードして上書きします。
例として、このコードシーケンス(実際のコードに基づいており、AT&T形式ではなくIntelでは)は、16バイトを超える値が0になるまで、その内容からスタックポインターを継続的にロードします。
576 cmpq [rsp+0x10],0x0
582 jz 594
588 movq rsp,[rsp]
592 jmp 576
594 ...
スタックフレームウォーキングコードではない可能性がありますが、通常は使用されていないもののスタックポインターを抑制するため、珍しいことです。
それ は ムーブアップスタックフレームには通常、スタックポインターとベースポインターが含まれるという点では珍しいことですが、通常は1つのレベルを上げるだけです(つまり、関数からの戻り)。
複数のレベルを上に移動する上記のようなコードの場合、必要な場所に入るまでスタックポインターを使用するだけで、ベースポインターをポップしてからポップする方がおそらく速いです(コンベンションを呼び出すと、現在のベースがプッシュされることがよくあります変更する前にポインターを変更して、シンプルなポップが古い値を回復するようにします)。
他のヒント
これは64ビット値のmovです。 QuadとQuadであるMovqの「Q」のために64ビットは64ビットです。
Lが32ビットであるMOVLなど、他の例があります。
ただし、MOVQ(%RSP)の場合、ATT構文を使用して%RSP。
movq(%rsp)、%rsp-> movqはopcodeと呼ばれ、(%rsp)はソースまたはsrcと呼ばれ、%rspは宛先またはdstと呼ばれます。
それが行うことは、レジスタ%RSPで検索され、その値を取得し、その値のメモリ値を意味するメモリ[bracket "()を意味することを意味し、それを%rspに割り当てることです。
どちらも同じ登録ですが、違いは%RSPの値が変化することです。
例:%RSPが値22を持っているとしましょう。しかし、%RSPのメモリは30です。
この命令の使用movq(%rsp)、%rsp
%RSPの新しい値は30です。再び(%RSP)は22であると仮定し、(%RSP)がメモリ値30に移動し、宛先の%RSPに割り当てるため、%RSPの値を取得します。 %RSP自体。