Frage

Ich habe einige Codes zu lesen und war nicht sicher, was diese Zeile tut:

movq (%rsp), %rsp
War es hilfreich?

Lösung

movq (vorausgesetzt, Sie sprechen x86) ist eine Bewegung von einem Quadwort (64-Bit-Wert). Diese besondere Anweisung:

movq (%rsp), %rsp

sieht sehr ähnlich wie Code, der durch Stapelrahmen hinaufgehen wird. Diese besondere Anweisung greift nach dem Viererwort durch den aktuellen Stapelzeiger und lädt es in den Stapelzeiger, Überschreiben wies auf.

Als Beispiel diese Code-Sequenz (basierend auf realen Code und in Intel eher, dass AT & T-Format) wird den Stapelzeiger von seinem Inhalt, bis der Wert 16 Bytes kontinuierlich lädt darüber hinaus 0 ist.

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...

Es ist möglich, es nicht Stack-Frame-Walking-Code sein kann, aber es ist ungewöhnlich, da es den Stapelzeiger für etwas suborning würde es in der Regel nicht verwendet für.

Es is ungewöhnlich, dass Stapelrahmen bewegt sich in der Regel beinhaltet Stapelzeiger und Basiszeiger, aber das ist in der Regel nur für eine Ebene hinauf (das heißt, eine Rückkehr von einer Funktion).

Für die Art von Code oben gezeigt, wo Sie wollen mehrere Ebenen bewegen, ist es wahrscheinlich schneller nur den Stapelzeiger verwenden, bis Sie bekommen, wo Sie sein müssen, dann den Basiszeiger abspringt dann (Aufrufkonventionen wird oft Push die aktuellen Basiszeiger, bevor es zu ändern, so dass ein einfaches Pop wird den alten Wert) erholen.

Andere Tipps

Es ist ein 64-Bit-Wert mov. Seine 64-Bit wegen der „q“ in movq die Quad und Quad ist 64-Bit.

Es kann ein anderes Beispiel sein, wie movl in denen l 32 Bit ist.

, aber im Fall von movq (% rsp),% rsp mit ATT Syntax ..

Die movq (% rsp),% rsp. -> movq genannt wird Opcode (% rsp) aufgerufen Quelle oder src und% rsp ist das Ziel oder die dst genannt

, was sie tut, ist, dass es im Register% rsp nachschlägt erhält seinen Wert und geht in den Speicher [der Klammer „()“ Mittel in den Speicher Wert gehen] von diesem Wert und dann ordnet sie% rsp.

Während beide gleiche Register sind der Unterschied ist, dass der Wert von% rsp Änderungen.

Beispiel: sagen wir mal% rsp hat den Wert 22. Aber die Erinnerung an% rsp ist 30.

Mit dieser Anweisung movq (% rsp),% rsp

Der neue Wert von% rsp ist 30. Wieder da (% rsp), um den Wert von% rsp bekommt die 22 und dann (% rsp) ist davon ausgehen, geht an den Speicherwert 30 und dann ordnet sie% rsp auf dem Ziel , was% rsp selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top