Not logged in. · Lost password · Register

Page:  1  2  next 
Drager
Avatar
Member since Jan 2003
306 posts
Subject: Unterprogramme
hoi,

also ich hab hier bei dem code etwas probleme(S.127):

pushl %ebp
movl %esp, %ebp
subl $4, %esp
...
pushl -4(%ebp)
pushl -4(%ebp)
call proc
addl $8, %esp
...
movl %ebp, %esp
popl %ebp
ret

kann mir das mal wer vielleicht schrittweise erklären? weil ich z.b. net weiss für was das pushl am anfang sein soll, und wieso man den stack pointer dann um vier verschiebt (speicher reserviert..)

thx

Drager
Wer nichts weiss, muss alles glauben.
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
So wie ich das verstanden hab müsste das so gehn...

//sicher den Framepointer auf dem Stack, schau mal auf S.128 dann siehst du warum
pushl %ebp
//sicher die Stackadresse(wo die Variablen liegen werden) auf dem Framepointer
movl %esp, %ebp
//reservier Platz auf dem Stack für die long int x
subl $4, %esp
...
//proc(x,x) braucht ja 2 mal die Variable x, also wird x 2 mal auf den Stack gepusht(Variablen an proc übergeben)
pushl -4(%ebp)
pushl -4(%ebp)
//proc normal aufrufen
call proc
//bei rückkehr die übergebenen Variablen wieder "löschen"/freigeben
addl $8, %esp
...
//ursprüngliche Adresse wieder auf den Stackpointer kopieren
movl %ebp, %esp
//Framepointer vom Stack löschen, Unterprogramm ist ja fertig
popl %ebp
ret

... also ohne Gewähr, aber das klingt logisch für mich  :-D
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
urchichako
Ardillo
Member since Apr 2003
256 posts
In reply to post #1
hab den satz gefunden für i386:
PUSH decrements the stack pointer by 2 if the operand-size attribute of the instruction is 16 bits; otherwise, it decrements the stack pointer by 4. PUSH then places the operand on the new top of stack, which is pointed to by the stack pointer.
The 80386 PUSH eSP instruction pushes the value of eSP as it existed before the instruction. This differs from the 8086, where PUSH SP pushes the new value (decremented by 2).

ansonsten hab ich das gleiche problem :-D
Those who find ugly meanings in beautiful things are corrupt without being charming. This is a fault.
Those who find beautiful meanings in beautiful things are the cultivated. For these there is hope.
urchichako
Ardillo
Member since Apr 2003
256 posts
hey danke für die erklärung! so langsam hats dadurch bei mir auch gedämmert!
Those who find ugly meanings in beautiful things are corrupt without being charming. This is a fault.
Those who find beautiful meanings in beautiful things are the cultivated. For these there is hope.
Drager
Avatar
Member since Jan 2003
306 posts
In reply to post #2
oki danke,

und ist dann das pushl des %ebp "nur" für debug informationen gut?
Wer nichts weiss, muss alles glauben.
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
Quote by Drager:
und ist dann das pushl des %ebp "nur" für debug informationen gut?

glaub schon, nen anderen sinn seh ich nicht ...und der gcc gibt mir teilweise recht....
hab ne fakultätsfunktion mal mit der option -fomit-frame-pointer(was wohl unnötigen debug code raushaut) in assembler umgewandelt und es sind ein paar pushl %ebp verschwunden ... das in der .main ist immer noch da aber ich werte das jetzt trotzdem mal als Bestätigung und was der GCC so ausspuckt is eh manchmal strange  :anx:
besonders witzig wirds bei gcc -S -g bla.c  :-D
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
Drager
Avatar
Member since Jan 2003
306 posts
hm ich hab mir das nochmal durch den kopf gehn lassen, brauch ich das push und pop von &ebp nicht auch dafür um den alten rücksprung wert wieder zubekommen , wenn ich aus nem unterprogramm zurück komme? weil ich doch im unterprogramm den %ebp überschreiben habe...(mit dem rücksprung wertes des unterprogrammes)

also wenn ich mehrer unterprogramme ineinander schachtle...
Wer nichts weiss, muss alles glauben.
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3266 posts
Laut meinem Script ist das eher so:
Nachdem sich der Stackpointer bekanntlich bei jedem push/pop ändert, müsste man bei wiederholtem Zugriff z.B. auf die übergebenen Variablen an das Unterprogramm auf dem Stack immer verschiedene Kalkulationen anführen.

Um das zu Vermeiden, gibt es den Framepointer, der zu Beginn des Unterprogramms den Stackpointer sichert. Über den Framepointer kann man dann egal wieviel man gepoppt hat [tm] immer wieder mit dem gleichen Displacement auf die entspr. Variablen zugreifen.

Natürlich ist das *auch* für Debug-Zwecke sinnvoll, da man den Frame-Pointer zurückverfolgen kann und so weiter.


Im Allgemeinen ist der Framepointer als redundant anzusehen, aber auch als sehr praktisch, spätestens wenn man den Code per Hand schreibt.


Natürlich muss für die Verschachtelung von Unterprogrammen der Framepointer am Anfang gepusht und am ende gepopt werden, was ja auch in dem Beispiel der Fall ist.


cu
Ford Prefect
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
ich wuerd gern noch wissen warum man im Framepointer Beispiel nur 4 bytes reserviert und dann 8 wieder freigibt? der macht doch  "subl $4, %esp"

kann mir das jemand mal erklaeren? ansonsten waere mir das prinzip der benutzung schon klar...
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Claudius
Avatar
Member since Oct 2002
956 posts
2 pushl rückgängig machen, oder?
Im mod(1) sind wir alle gleich....
UQi ⊂ ΦMilch ⊂ ΦNutz ;i ∈ ℕ
Q ∪ Φk = φNutz ∀k ∈ Deck
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
ja, aber ich dachte man muss genausoviel allokieren (mindestens) wie man freigibt???
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Claudius
Avatar
Member since Oct 2002
956 posts
der macht da nur seine eigenen Variablen wieder runter, die er übergeben bekommen hat(anders gesagt, ich glaube, das ist nur von der Unterfunktion)
das Var x freigeben ist wahrscheinlich irgendwo in den Punkten versteckt :o)
Im mod(1) sind wir alle gleich....
UQi ⊂ ΦMilch ⊂ ΦNutz ;i ∈ ℕ
Q ∪ Φk = φNutz ∀k ∈ Deck
Drager
Avatar
Member since Jan 2003
306 posts
ja ich glaub auch das der nur die übergebenen freigibt.. x könnte er ja noch in der funktion selbst verweden.. aber muss ich das x wirklich freigeben? ich spring doch eh wieder auf den anfang (movl %ebp %esp) zurück dadurch ist es doch eh weg oder?
Wer nichts weiss, muss alles glauben.
Claudius
Avatar
Member since Oct 2002
956 posts
da hast du ziemlich recht glaub ich... das man sowas nicht gleich selber sieht....
Im mod(1) sind wir alle gleich....
UQi ⊂ ΦMilch ⊂ ΦNutz ;i ∈ ℕ
Q ∪ Φk = φNutz ∀k ∈ Deck
ML
Avatar
Member since Oct 2003
66 posts
Hallo Welt!


Also ich habe eines noch nicht verstanden - und zwar: Skript Seite 119:

weshalb wird beim Unterprogrammaufruf "substract", um auf z zuzugreifen, 4(%esp) angegeben, und um auf y zuzugreifen 8(%esp)?   Ich verstehe das nicht. Der Stackpointer müsste doch eigentlich aktuell auf y zeigen, sodass die zugriffe so erfolgen müssten: y=(%esp), z=4(%esp).  
Also nach "movl y, -(%esp)" müsste der Stackpointer auf den Wert von y aufm Stak zeigen...
Wo wird denn der stackpointer im Hauptprogramm nochmal um 4 runtergesetzt, sodass  auf diese Weise ein Displacement von 4 bzw. 8 zustande kommt?

Ich hab das ganze auch selber nochmal geschrieben und als assembler-Code übersetzen lassen - da ist es aber genau wie im skript. Also habe eindeutig ich nen denkfehler.

Vielen Dank
Gruß, Marco
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen