私はいくつかのコードを読んでいて、この行が何をするのかわかりませんでした:
movq (%rsp), %rsp
movq
(x86について話していると想定)は、クワッドワード(64ビット値)の移動です。この特定の指示:
movq (%rsp), %rsp
スタックフレームをたどるコードとよく似ています。この特定の命令は、現在のスタックポインターが指すクワッドワードを取得し、スタックポインターにロードして上書きします。
例として、このコードシーケンス(実際のコードに基づいており、IntelではAT&T形式ではありません)は、スタックポインターをその内容から16バイトを超える値が0になるまで継続的にロードします。
576 cmpq [rsp+0x10],0x0
582 jz 594
588 movq rsp,[rsp]
592 jmp 576
594 ...
スタックフレームウォーキングコードではない可能性もありますが、通常は使用されないもののスタックポインターのサブオーニングになるため、異常です。
isスタックフレームの上位への移動には通常、スタックポインターとベースポインターが含まれますが、これは通常、1つ上のレベル(つまり、関数からの戻り)を対象としています。
複数のレベルを上に移動する上記のコードの種類の場合、必要な場所に到達するまでスタックポインターを使用し、その後ベースポインターをポップする方がおそらく高速です(呼び出し規則は、多くの場合、現在のベースをプッシュしますポインタを変更する前に、単純なポップで古い値を回復できるようにします)。
64bit値のmovです。クワッドであり、クワッドであるmovqの「q」が64ビットであるため、その64ビットです。
Lが32ビットであるmovlなどの他の例も考えられます。
ただし、movq(%rsp)の場合、%rspはATT構文を使用します。
Movq(%rsp)、%rsp-> movqはopcodeと呼ばれ、(%rsp)はソースまたはsrcと呼ばれ、%rspは宛先またはdstと呼ばれます。
これは、レジスタ%rspを検索してその値を取得し、その値のメモリに移動します(角かっこ(())はメモリ値に移動することを意味します)。次に、それを%rspに割り当てます。
どちらも同じレジスタですが、%rspの値が変化するという違いがあります。
EG:letは%rspの値が22であると言います。しかし、%rspのメモリは30です。
この命令movq(%rsp)、%rspを使用
%rspの新しい値は30です。ここでも、(%rsp)は、22と想定される%rspの値を取得し、(%rsp)はメモリ値30に移動して、宛先の%rspに割り当てます。 %rsp自体。