Frage:
Ist der Zugriff auf den Stack genauso schnell wie der Zugriff auf den Speicher?
Zum Beispiel könnte ich mich dafür entscheiden, einige Arbeiten innerhalb des Stapels zu erledigen, oder ich könnte direkt mit einer gekennzeichneten Stelle im Speicher arbeiten.
Also konkret: ist push ax
die gleiche Geschwindigkeit wie mov [bx], ax
? Ebenso ist pop ax
die gleiche Geschwindigkeit wie mov ax, [bx]
? (Angenommen, bx hat einen Standort in near
Erinnerung.)
Motivation für die Frage:
In C ist es üblich, von trivialen Funktionen abzuraten, die Parameter annehmen.
Ich habe immer gedacht, dass dies nicht nur daran liegt, dass die Parameter auf den Stack geschoben und dann vom Stack entfernt werden müssen, sobald die Funktion zurückkehrt, sondern auch daran, dass der Funktionsaufruf selbst den Kontext der CPU bewahren muss, was mehr Stack-Nutzung bedeutet.
Aber vorausgesetzt, man kennt die Antwort auf die Frage mit der Überschrift, sollte es möglich sein, den Aufwand, den die Funktion verwendet, um sich selbst einzurichten (Push / Pop / Erhaltung des Kontexts usw.), in Bezug auf eine äquivalente Anzahl direkter Speicherzugriffe zu quantifizieren. Daher die überschriebene Frage.
(Bearbeiten: Klarstellung: near
oben verwendet ist im Gegensatz zu far
in dem Segmentiertes Speichermodell der 16-Bit-x86-Architektur.)
Wow. Ich bin ein Entdecker. Ich habe gerade eine gute Nicht-n00b-Frage auf StackOverflow gefunden. Ich feiere meine Erkundung mit Champagner und einer positiven Bewertung!
– Benutzer529758
7. Oktober 2012 um 6:11 Uhr
Ich habe die Dekrement-/Inkrement-Operationen von Push/Pop-Aufrufen auf ESP immer als Overhead im Vergleich zu mov angesehen … aber ich denke, es sollte noch viel mehr dahinterstecken.
– loxxy
7. Oktober 2012 um 6:30 Uhr