質問

私はいくつかのコードを読んでいたが、この行が何をするのかわからなかった:

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自体。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top