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:
- Zunächst einmal, warum muss ich verwenden
%rbp
? Ist es nicht einfacher zu bedienen%rsp
da sein Inhalt verschoben wird%rbp
in der 2. Zeile? - Warum muss ich etwas von abziehen?
%rsp
? Ich meine, es ist nicht immer16
Als ich warprintf
ing wie 7 oder 8 Variablen, dann würde ich subtrahieren24
oder28
.
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