Autor Thema: C-Calling Convention verbessern  (Gelesen 4415 mal)

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« 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 -.-

Krox

  • Beiträge: 38
    • Profil anzeigen
    • Coding42.de
Gespeichert
« Antwort #1 am: 14. April 2006, 22:09 »
Abgesehen davon, dass die Methode wohl kaum schneller ist (ändert sich ja nur die Reihenfolge der Befehle).... der Fehler is schon lustig  :lol:
21 ist nur die halbe Wahrheit

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. April 2006, 22:22 »
Rücksprungadresse? :roll:
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 14. April 2006, 22:50 »
@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...

Krox

  • Beiträge: 38
    • Profil anzeigen
    • Coding42.de
Gespeichert
« Antwort #4 am: 14. April 2006, 23:20 »
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?
21 ist nur die halbe Wahrheit

lordnaikon

  • Beiträge: 36
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. April 2006, 00:00 »
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

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 15. April 2006, 00:08 »
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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. April 2006, 00:08 »
Ich halte den Unterschied nicht für ganz so bedeutsam wie den zwischen einer Endlosschleife und a += 5. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #8 am: 15. April 2006, 00:39 »
Und jo, am Stackpointer rumspielen und dann ret? Viel Spass im Datennirvana ^^
*post*

 

Einloggen