Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Assembler Codeschnipsel

Hallöchen an alle da draussen :-)

Ich hab folgendes Problem: Wir sollen ein Assembler Programm schreiben, welches uns interativ die Anzahl der ganzzahligen Teiler einer Zahl ermittelt. Das Programm hab ich schon geschrieben und funktioniert auch prima. Nur haben wir Vorgaben bekommen, die wir nicht verändern sollen, was ich auch nicht getan habe ... jedoch frage ich mich, was genau die da machen ... kann mir das einer von Euch vielleicht erklären?

 

Zitat

   pushl   %ebp
   movl   %esp, %ebp
   subl   $8, %esp
   andl   $-16, %esp
   movl   $0, %eax
   subl   %eax, %esp

Die ersten Zeilen versteh ich ja auch, erst puschen die den basepointer auf den Stack, dann setzen sie den Basepointer auf das letzte Element des Stacks (der alte basepointer), dann reservieren sie 8 Byte (also Platz für 2 Integerzahlen) (subl $8, %esp) aber die nächsten Zeilen verwirren mich.

Was bewirkt die logische AND Verknüpfung mit der 16? Wir haben hier ein klein wenig herum probiert und heraus gefunden, daß bei and-Verknüpfung mit der -16 die letzten 4 Bits einfach auf 0 geschrieben werden. Demzufolge ziehen wir, je nachdem was vorher drin stand, eine Zahl zwischen 0 und 15 ab. Was soll das?

Des weiteren diese merkwürdigen letzten beiden Zeilen:
 
Zitat
   movl   $0, %eax
   subl   %eax, %esp
erst schreiben sie anscheinend 0 in EAX und dann subtrahieren sie 0 von esp?

Unsere Vermutung ist ja, die haben erst ein C++ Programm geschrieben, das dann in Assembler Umgewandelt und uns dann die sch...e gegeben. Unser Proggi funktioniert, aber wenn die uns fragen, was das da vorne macht, sehen wir alt aus. Hat jemand von Euch eine Idee?

hoffnungsvollen Gruß
Maddin

Antworten zu Assembler Codeschnipsel:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hab eine halbwegs zufrieden stellende Antwort gefunden ...

diese Vorgehensweise resultiert aus alten Zeiten, als noch mit Segmenten gearbeitet wurde. Es ist gewünscht, daß der esp auf einem "runden" Speicherwert sitzt, d.h. nicht auf 0x4 oder 0x8 oder 0xc sondern auf 0x0 ... daher wird hier, unabhängig von den vorhergehend initialisierten Variablen einfach ein klein wenig Speicher "verschenkt" und der esp auf die nächst folgende "runde" Speicheradresse gesetzt ...

Gruß Maddin


« Assembler und PointerHilfe beim Lernen von C++ »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

WebP
WebP ist ein von Google entwickeltes Bildformat, das speziell für die Verwendung im Web konzipiert wurde. Es unterstützt eine sehr gute Kompression bei gleicher...