web-dev-qa-db-ja.com

movqアセンブリ関数

私はいくつかのコードを読んでいて、この行が何をするのかわかりませんでした:

movq (%rsp), %rsp
25
jamesatha

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つ上のレベル(つまり、関数からの戻り)を対象としています。

複数のレベルを上に移動する上記のコードの種類の場合、必要な場所に到達するまでスタックポインターを使用し、その後ベースポインターをポップする方がおそらく高速です(呼び出し規則は、多くの場合、現在のベースをプッシュしますポインタを変更する前に、単純なポップで古い値を回復できるようにします)。

34
paxdiablo

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

15
bmm