Lowlevel
OffZone => Offtopic => Thema gestartet von: scales of justice am 14. April 2006, 18:58
-
Heute hab ich versucht die C-Calling Convention schneller zu machen:
angenommen ich will eine Textschreibe Funktion aufrufen:
push dx ;in dx steht die Adresse
call text ;Text ist die Schreibfunktion
add sp, 2 ;hier wird dx dann wieder gelöscht
nun dachte ich, dass es ja eigentlich doof ist jedesmal wieder sp um 2 zu addieren,
dass kann man ja einfach direkt in der Funktion machen, dann muss mans nicht immer wieder machen:
text:
push bp
mov bp, sp
;eigentliche Funktion
mov sp, bp
pop bp
add sp, 2
ret
und dafür hab ich das bei de aufrufenden Teil weggelassen
danach hab ich 2 Stunden rumprobiert, bis ich mein Programm wieder am Laufen hatte, ich dachte das hat nix damit zu tun,
hatte es am Ende aber doch
jetzt dürf ihr mal raten wo der Fehler ist -.-
-
Abgesehen davon, dass die Methode wohl kaum schneller ist (ändert sich ja nur die Reihenfolge der Befehle).... der Fehler is schon lustig :lol:
-
Rücksprungadresse? :roll:
-
@Krox:
indirekt eigentlich schon, da es weniger Befehle gäbe
vorrausgesetzt man braucht die Funktion öfters
und wenn man Befehle weg lässt wird das Programm immer schneller
ich hab extra noch überlegt ob man das wirklich da reinschreiben kann, aber mir ist nicht eingefallen warum nicht
naja, aus Fehlern lernt man...
-
hm... kleiner wird das Programm, da ja das "sub 2" nur einmal auftaucht, und nicht bei jedem Aufruf der Funktion. Aber ausgeführt wird es doch trotzdem jedes mal und ergo wird es nicht schneller....
Oder steh' ich jetzt auf'm Schlauch?
-
würde auch krox zustimmen ...kleiner ja, schneller nein ... würde ich als asm laie sagen.
das ist wie der unterschied zwischen
for(i=0;1<5;i++)
{
a++;
}
und
a++;
a++;
a++;
a++;
a++;
wenn ich das richtig sehe
mfg lordN
-
hm, stimmt eigentlich, laden muss der Prozessor ja genauso viel,
die Anweisung kommt zwar nicht mehr so oft vor, dafür muss er sie aber öfter von der Gleichen Stelle laden
aber der C-Code ist ja wieder was ganz anderes
für die For-Schleife wird ja eine extra Variable angelegt
-
Ich halte den Unterschied nicht für ganz so bedeutsam wie den zwischen einer Endlosschleife und a += 5. ;)
-
Und jo, am Stackpointer rumspielen und dann ret? Viel Spass im Datennirvana ^^