AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Stack in Assembler

Ein Thema von Tormentor32 · begonnen am 5. Jan 2007 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Frage zum Stack in Assembler

  Alt 5. Jan 2007, 15:43
Zitat:
Dieses Verhalten ist standardmäßig bei ein Funktion mit folgenden Eigenschaften

1. Es ist eine reine Assemblerfunktion
2. Sie hat mindestens 4 Parameter
3. Es gibt keine (?) lokalen variablen in der Funktion
4. Nochwas?
Jein!

Als standardmäßig würde ich sowieso nichts erwarten. Bsw. kann Delphi auch mal eine lokale Variable (z.B. Zählvariable) nur im Register vorhalten und gar nicht erst auf den Stack legen. Dadurch können wieder ganz andere Sachen entstehen...
Wenn was nicht klappt kann man eh mit dem Debugger dürber gehen und sich ansehen, was der Compiler so hergestellt hat. [Strg]+[Alt]+[C] während des Debuggens hilft da Wunder.

1. Gehen wir davon aus, du baust eine reine Assemblerfunktion. Da musst du dir ja deinen Speicherplatz für lokale Variablen selber organisieren (sub esp, Anzahl_bytes).
2. Du übergibst nur 32 Bit-Variablen (Pointer oder Integer) - Boolean müsste auch gehen
(so, das müssten die Bedingungen gewesen sein)

--> Dan liegen die ersten 3 Parameter in den Registern und die nächsten (verkehrtrum) im Stack

also für
function test(m,n,o,p,q,r:integer):integer; liegt
m -->eax
n -->edx
o -->ecx
p -->[ebp+16]
q -->[ebp+12]
r -->[ebp+8]
Das liegt an der Aufrufkonvention register (die man nicht angeben muss->standard)

Und jetzt für Aufrufkonvention stdcall
function test(m,n,o,p,q,r:integer):integer;stdcall; m -->[ebp+8]
n -->[ebp+12]
o -->[ebp+16]
p -->[ebp+20]
q -->[ebp+24]
r -->[ebp+28]
(Die Reihenfolge ist genau andersrum und nix liegt in den Registern)
Das sind auch die unter Delphi gebräuchlichsten Aufrufkonventionen.

Was macht Delphi und warum ist das so (Beispiel für register):
Delphi-Quellcode:
//Pseudocode
push p
push q
push r
mov eax,m
mov eax,n
mov eax,o
call test

//-->Sprung zu test
push ebp
mov ebp,esp
.
.
//dein Code
.
.
pop ebp
ret
(für stdcall pusht er einfach die Register von hinten nach vorne durch vor dem Aufruf von call)

Demnach liegen auf dem Stack:
-p
-q
-r
-[Rücksprungadresse -->nächste Adresse unterhalb von call]
-ebp (gerettet, denn auch die aufrufende Funktion will nachher ihr Basis (Referenz)-Register für lokale Variablen wiederhaben)
(für stdcall liegen alle Parameter und alle andersrum im Stack)
Und das ist alles. Jetzt ist noch zu Beachten, das der stack (Stapel) auf dem Kopf liegt:
-die Adressen werden von oben nach unten kleiner
-Es wird immer unten angefügt

Ansonsten ist ein Stack ganz normal über Pointer adressierbar, man sollte nur wissen, wo man rumschreiben darf [esp+x] (lokale Variablen) und wo man maximal lesen darf [esp-x] (Parameter und alles andere)


Ich hoffe das war alles und es war alles richtig. Angaben sind ohne Gewähr! Bitte immer selber nachprüfen!


Edit: Verdammt: 1. Fehler korrigiert
Also bei sowas verhaspel ich mich immer. Wenn hier kein Fehler mehr drinn sein sollte könnt ihr mich küssen.

Edit2: Ich hab mal deine Funktionen kurz eingetippt
Delphi-Quellcode:
function addiere4(a,b,c,d:integer):integer;
asm
  add eax,edx
  add eax,ecx
  add eax,[ebp+8]
end;
function addiere4stdcall(a,b,c,d:integer):integer;stdcall;
asm
  mov eax,[ebp+8]
  add eax,[ebp+12]
  add eax,[ebp+16]
  add eax,[ebp+20]
end;
Aber wie gesagt, alles nur für Integer (bzw.Pointer). Ich glaub double landet immer auf dem Stack (egal ob register) und belegt natürlich auch 8 Bytes. Es kann allerdings auch der Stack der FPU sein. Komplizierte Compiler-Welt...
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#12

Re: Frage zum Stack in Assembler

  Alt 7. Jan 2007, 00:55
Vielen Dank für die ausführliche Antwort!

Ich hab momentan kein Delphi zur Hand, aber ich werds am Montag ausprobieren, bzw damit rumprobieren, sollten noch weitere Fragen auftauchen, stelle ich sie einfach hier

Schönes Wochenende noch

Richard
Richard Mahr
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Frage zum Stack in Assembler

  Alt 7. Jan 2007, 10:59
Jetzt wollte ich grad noch einen kleinen Fehler korrigieren, aber durfte nicht mehr .

Also in den beiden Zeilen:
Zitat:
Ansonsten ist ein Stack ganz normal über Pointer adressierbar, man sollte nur wissen, wo man rumschreiben darf [esp+x] (lokale Variablen) und wo man maximal lesen darf [esp-x] (Parameter und alles andere)
..müsste eher [ebp+x] bzw. [ebp-x] stehen, da man ebp eher selten verändert (wenn man es natürlich macht, gilt diese Regel nicht mehr) aber esp ständig durch push und pop und Anlegen lokaler Variablen verändert wird.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz