Was ist der Zweck des RBP-Registers im x86_64-Assembler?

Lesezeit: 3 Minuten

Also versuche ich, ein bisschen Assembler zu lernen, weil ich es für den Computerarchitekturunterricht brauche. Ich habe ein paar Programme geschrieben, wie das Drucken der Fibonacci-Folge.

Ich habe erkannt, dass ich diese 3 Zeilen verwende, wenn ich eine Funktion schreibe (wie ich aus dem Vergleich von Assembler-Code gelernt habe, der aus generiert wurde gcc zu seinem C Äquivalent):

pushq   %rbp
movq    %rsp, %rbp
subq    $16, %rsp

Ich habe 2 Fragen dazu:

  1. Zunächst einmal, warum muss ich verwenden %rbp? Ist es nicht einfacher zu bedienen %rspda sein Inhalt verschoben wird %rbp in der 2. Zeile?
  2. Warum muss ich etwas von abziehen? %rsp? Ich meine, es ist nicht immer 16Als ich war printfing wie 7 oder 8 Variablen, dann würde ich subtrahieren 24 oder 28.

Ich verwende Manjaro 64-Bit auf einer virtuellen Maschine (4 GB RAM), Intel 64-Bit-Prozessor

  • Sie haben vergessen, die Optimierung zu aktivieren. Der zu subtrahierende Betrag hängt von den Ausrichtungsanforderungen ab und davon, ob Sie die rote Zone verwenden können.

    – Narr

    28. Januar 2017 um 17:44 Uhr

  • @Jester Das Aktivieren der Optimierung bedeutet nicht unbedingt, dass auch das Weglassen des Frame-Zeigers aktiviert wird

    – Govind Parmar

    28. Januar 2017 um 17:49 Uhr

  • Mögliches Duplikat von Was ist genau der Basiszeiger und der Stapelzeiger? Worauf weisen sie hin?. IOW ist es dasselbe wie im x86_32-Code.

    – Jongware

    28. Januar 2017 um 17:50 Uhr


  • @GovindParmar hängt vom Compiler ab, aber Sie selbst haben gcc erraten, wo dies der Fall ist. Auch das Subtrahieren von rsp ohne Grund (was von OP angedeutet wird) sagt auch keine Optimierung aus.

    – Narr

    28. Januar 2017 um 17:53 Uhr

  • Mögliches Duplikat von Was ist der Zweck des EBP-Frame-Pointer-Registers?

    – phuklv

    11. Juni 2018 um 9:39 Uhr

  • Genau, es nutzt %rsp!. Aber es z. B. wenn ich movl erste Konstante, z movl $10 es bewegt es zu 4(%rsp). Warum nicht -4? Und übrigens, warum es noch etwas Wert abzieht %rsp? Ich habe es nicht durch Kommentare verstanden

    Benutzer6827707

    28. Januar 2017 um 18:43 Uhr

  • Der @FrynioS-Compiler weist bei der Eingabe der Funktion etwas Platz für lokale Werte zu. Deshalb subtrahiert es bei der Eingabe den Wert von %rsp. Dies hängt nicht davon ab, ob %rbp als Frame-Zeiger verwendet wird. Danach wird diese Stelle mit positiven Offsets auf %rsp verwendet. Auch wenn diese Funktion eine andere aufruft, wird %rsp für jeden Aufruf an der 16-Byte-Grenze ausgerichtet, also subtrahiert der Compiler in diesem Fall 8 von %rsp bei jeder Eingabe.

    – Netsch

    29. Januar 2017 um 5:52 Uhr

  • @FrynioS Beachten Sie auch, dass vor % rsp ein 128-Byte-Leerzeichen (“rote Zone”) vorhanden ist, das seinen Inhalt zwischen Funktionsaufrufen beibehält, aber während Unterbrechungen vom Betriebssystem beibehalten wird. Daher können sehr temporäre Werte (zwischen Funktionsaufrufen) mit negativen Offsets zu %rsp verwendet werden. Nicht alle Compiler nutzen dies.

    – Netsch

    29. Januar 2017 um 5:55 Uhr

  • Wow, Alter, das hat mir sehr geholfen! Danke für die Antwort (schade, dass ich eine andere Antwort als akzeptiert markiere :D)

    Benutzer6827707

    28. Januar 2017 um 20:42 Uhr

  • @FrynioS: Keine Sorge, es ist alles gut! Ich betrachtete dies eher als “Hintergrundinformationen, die manche nützlich finden könnten”, oder Dinge, die Sie wahrscheinlich wissen wollen, wenn Sie sich über dieses Zeug wundernwährend Govind Parmar die von Ihnen gestellten Fragen stellte.

    – Nominelles Tier

    28. Januar 2017 um 21:04 Uhr

  • @NominalAnimal bitte Tippfehler korrigieren: richtige Option ist -fomit-frame-pointer.

    – Netsch

    29. Januar 2017 um 5:58 Uhr

  • @Netch: D’Oh! Guter Fang; Danke für die Warnung. Jetzt behoben.

    – Nominelles Tier

    29. Januar 2017 um 13:12 Uhr

  • Das stimmt zwar eh_frame macht Rahmenzeiger nicht notwendig es ist nicht wahr, das zu sagen eh_frame verwendet keine Frame-Zeiger: Wenn der Compiler Frame-Zeiger für eine Funktion verwendet, beides eh_frame und debug_frame werde sie auf jeden Fall verwenden. Tatsächlich ist es ein allgemeiner Ratschlag, wenn Sie die Binärgröße reduzieren möchten, um sie hinzuzufügen -fno-omit-frame-pointer: Mit einigen Kosten für Codegröße/Leistung können Sie dramatisch kleiner werden eh_frame da ein Frame-Zeiger ungefähr der einfachste Weg ist, wie ein Stack-Frame gefunden werden kann, und daher ist die DWARF-Darstellung sehr prägnant.

    – BeeOnRope

    3. Januar 2018 um 19:01 Uhr


1422120cookie-checkWas ist der Zweck des RBP-Registers im x86_64-Assembler?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy