Frage:Kosten Push vs. mov (Stack vs. Naharbeitsspeicher) und der Aufwand für Funktionsaufrufe
Ist Zugriff auf den Stapel der gleichen Geschwindigkeit wie Speicher zugreifen?
Zum Beispiel könnte ich wählen, etwas Arbeit innerhalb des Stapels zu tun, oder ich könnte Arbeit direkt mit einem markierten Speicherort im Speicher tun.
Also, speziell: ist push ax
die gleiche Geschwindigkeit wie mov [bx], ax
? Ebenso ist pop ax
die gleiche Geschwindigkeit wie mov ax, [bx]
? (Nehmen bx einen Ort in near
Speicher hält.)
Motivation für Frage:
Es ist in C gemeinsamen triviale Funktionen abzuschrecken, die Parameter nehmen.
Ich dachte immer, das ist, weil nicht nur die Parameter auf den Stapel geschoben werden müssen und dann vom Stapel verschwinden, sobald die Funktion zurückgibt, sondern auch weil der Funktionsaufruf den Kontext der CPU bewahren muss, was mehr Stapel bedeutet Verwendung.
Aber vorausgesetzt, man weiß die Antwort auf die Überschrift Frage, sollte es möglich sein, den Overhead zu quantifizieren, den die Funktion verwendet, um sich selbst (push/pop/preserve Kontext, etc.) in Bezug auf eine äquivalente Anzahl von direkten Speicherzugriffe. Daher die Schlagzeile.
( bearbeiten: Klarstellung:
near
oben verwendet wird, wie in der
segmented memory model von 16-Bit-x86-Architektur zu
far
gegenüber.)
Wow. Ich bin ein Forscher. Ich habe gerade eine gute, nicht-n00b Frage zu StackOverflow gefunden. Erlebe meine Erkundung mit Champagner und einer Aufwertung! –
Ich dachte immer Push/Pop-Aufruf der Dekrement/Inkrement-Operationen auf ESP als Overhead im Vergleich zu mov .... aber ich denke, es sollte viel mehr zu sein. – loxxy