Assembler programmieren lernen

S

Sasku

Gast
Hallo zusammen,
Ich wollte mir privat eine neue Langzeit Aufgabe suchen... Da kam mir in den Sinn dass ich mich eventuell an die Planung eines kleines OS mache... Natürlich erstmal alles gaaaaaaaaanz klein und minimalistisch..Und das dauert ja dann schon lange.. Aber es soll mit der zeit ausgebaut werden usw.

Naja nun ist es ja so, dass ich um ein OS zu programmieren nicht an Assembler vorbei komme... Aber kann mir da jemand ein relativ aktuelles und auch recht gutes tutorial ( egal ob online, pdf oder ein Buch) für Assembler empfehlen kann?


Ich weiß dass ein eigenes OS eine Mammutaufgabe ist...Aber an all die Kritiker, lasst es mich wenigstens versuchen.. Ist ja insgesamt ein schönes Langzeitprojekt :)
 
Nur zu, zum Lernen ist die Aufgabe hervorragend. Dass es natürlich am Ende nicht produktiv sein wird, dürfte allen klar sein.

Allerdings ist Assembler zum OS programmieren nicht in dem Grad notwendig, wie du vllt denkst. Als erste Anlaufstelle kann ich dir www.lowlevel.eu als Lektüre nahelegen.
 
Ich würde mir einen möglichst kleinen Microprozessor mit Dev Board für diese Aufgabe aussuchen. So ein 16 oder 32 Bit Atmel, mit kompakten Befehlssatz. Da ist es eher möglich, eine Firmware aus Assemblercode zu überschauen als auf den mittlerweile sehr komplexen ARM oder x86 kompatiblen.
 
Ahh danke für die schnelle Antwort :) Ja dass es nicht wirklich produktiv wird ist klar.. Wäre zwar recht cool wenn es doch mal soweit wäre... Aber naja ich träume :')

Naja dass ich es brauchen würde hieß es nur nachdem ich n bisschen gegoogelt habe.. Danke dir jedenfalls :)
Ergänzung ()

Oke danke :)
 
Sasku schrieb:
Aber kann mir da jemand ein relativ aktuelles und auch recht gutes tutorial ( egal ob online, pdf oder ein Buch) für Assembler empfehlen kann?
Vorher für einen Prozessor entscheiden. ;) x86 fand ich immer recht grausam (bin aber nie richtig tief eingestiegen), die angenehm zu programmierenden Motorolas gibt es leider nicht mehr (MC680x0) und bei ARM bricht man sich einen ab mit atomarsten Code Einheiten.

Ich würde wahrscheinlich mit einem kleinen Dev Board oder Arduino beginnen. Irgendwas wo man mit wenig Aufwand schon was sieht und wo man später irgendwelche (zeitkritischen) Erweiterungen mit eigenem Code supporten kann.
 
Ich würde vor allem ein System nehmen, für das es Emulatoren gibt - Assembler-Programme sind unabhängig von der Architektur extrem schwer zu debuggen, wenn man nicht sieht, was genau die CPU da eigentlich rechnet.

Hab damals auch mit dem TI-84+ (Z80-Prozessor) angefangen, Assembler zu lernen, das Dingen ist relativ gut dokumentiert und der Befehlssatz der CPU ist recht einfach.

Edit:
Ein OS selbst zu programmieren macht wenig Sinn
Doch - Lerneffekt.
 
Zuletzt bearbeitet:
Ein OS selbst zu programmieren macht wenig Sinn, da bereits in großer Anzahl offene Betriebssysteme vorhanden sind. Zudem wirst du ohne gute Vorkenntnisse zu keinem brauchbaren Ergebnis kommen.
Es macht mehr Sinn, ein vorhandenes Open-Source OS zu untersuchen und zu studieren. Später kann man dann Anpassungen oder Erweiterungen vornehmen. Empfehlenswert für den Anfang sind Echtzeitbetriebssysteme für Mikrocontroller - der Kernel ist in diesem Fall noch recht überschaubar.
Konkret kann man ERIKA RTOS (http://erika.tuxfamily.org/drupal/) empfehlen, das über eine OSEK/VDX API verfügt und auf gängige Mikrocontroller portiert worden ist.
 
foxio schrieb:
Ein OS selbst zu programmieren macht wenig Sinn, da bereits in großer Anzahl offene Betriebssysteme vorhanden sind.
Der Mann will etwas lernen und ich finde das allein macht das Vorhaben schon sinnvoll. Es spielt auch überhaupt keine Rolle wie die Aussicht auf Erfolg, was das Ziel betrifft, aussieht, oder ob das schon X Leute vor einem und besser gemacht haben. Etwas zu lernen und dabei vielleicht seinen Horizont zu erweitern, lohnt sich meiner Meinung nach immer, egal worum es geht.
 
Sicher, etwas lernen und seinen Horizont erweitern ist das Ziel. Ich denke aber, dass es bezüglich des Lerneffekts effektiver ist, etwas bereits Vorhandenes - in dem bereits jahrelange Entwicklung und Know How steckt - zu untersuchen, als bei Null zu beginnen.
 
ich sehe das wie asdfman.

ich kann meinen horizont am bestern erweitern indem ich etwas selber erstelle .. indem ich an etwas von grund auf arbeite ..
natürlich kann ich auf ein bereits vorhandenes OS zugreifen.. allerdings verstehe ich dann immernoch nicht wieso, weshalb und warum man bestimmte dinge macht .. und wenn ich da von grund auf ( vielleicht ja mit ein wenig hilfe in dieser richtung.. also dass ich mir anschaue wie andere das gemacht haben ) etwas neues mache .. da ist das meiner meinung nach ( und ich kenne mich und meinen lernstil ) sehr viel sinnvoller als mich "nur" in ein bereits vorhandenes system einzulesen
 
Du kannst das natürlich machen, wie du möchtest - wollte nur meinen Senf dazugeben. ;)

Es besteht halt die Gefahr, dass die Lernerkenntnisse am Schluss nicht dem Stand der Technik entsprechen, wenn du das Rad neu erfindest. Meinetwegen kannst du gerne von Null auf beginnen, aber es wäre sinnvoll, ab und an zu schauen, wie bestimmte Dinge woanders bereits gelöst wurden.
 
Is ja in Ordnung ;)

Naja ich werde für mich persönlich das Rad schon recht neu erfinden.. Aber wenn ich dann mal auf nem gewissen stand bin schaue ich natürlich nach was ich wo hätte besser machen können.. So ist es ja nicht :)
 
foxio schrieb:
Sicher, etwas lernen und seinen Horizont erweitern ist das Ziel. Ich denke aber, dass es bezüglich des Lerneffekts effektiver ist, etwas bereits Vorhandenes - in dem bereits jahrelange Entwicklung und Know How steckt - zu untersuchen, als bei Null zu beginnen.
Würd ich anders sehen: Production quality code,der bis auf den letzten Cylce und Byte optimiert ist, ist meist nicht gerade das, was man sich als Anfänger ohne Anleitung antun möchte. Natürlich sollte man sich dann auch ansehen, wie die Profis das machen, aber um den Code (bzw. die Ideen dahinter) überhaupt zu verstehen hilft es, wenn man schonmal versucht hat die Basisversion selbst zu schreiben.

Dem Tipp mit den MC-RTOS würde ich aber absolut zustimmen.
 
Miuwa schrieb:
Dem Tipp mit den MC-RTOS würde ich aber absolut zustimmen.

Obwohl das System (Hardware + Entwicklungssystem) für einen Einsteiger schon recht anspruchsvoll ist. Für "mal ab und zu was machen" stelle ich mir das schwierig vor. Vielleicht besser, ein einfach zu installierendes Assembler/Editor/Umgebungs-System für Windows verwenden und erste Schritte damit unternehmen.

Ich hab das selber mal probiert und konnte nach 1-2 Stunden google+ Installation+Beispiele anschauen bereits 'Hello, Assembler' unter Windows in der CMD ausgeben. Das ganze System nennt sich GoTools, hat einen Assembler und auch für Windows alles dabei. Die Dokumentation ist prima.
Code:
.Data
 TEMP   DD  0                  ; dword 32bit (int temp)
 HELLO  DB 'Hello, Assembler!' ; string L = 17


.Code
START:

 Push      -11                    ; 
 Call      GetStdHandle    ; eax: STD_OUTPUT_HANDLE 
 Push      0                        ;
 Push      Offset TEMP       ; TEMP bekommt return-Wert
 Push      17                      ; strlen
 Push      Offset HELLO       ; Text
 Push      Eax                  ; handle to active screen buffer
 Call      WriteFile            ; rausschreiben       
 Xor       Eax, Eax             ; return eax=0, Returnwert Windows

 Ret

Hab ich mich echt gefreut, das so einfach unter Windows 10 hinzubekommen. Sowas habe ich zuletzt ca. 1993 gemacht ;)
 
Zuletzt bearbeitet:
Wirklich viel Assembler benötigt man für ein OS aber nicht. Am Anfang muss man sicherlich ein paar Flags und co setzen und die States umschalten aber sobald es ans Eingemachte geht kann man getrost C (oder C++ wenn man denn möchte) benutzen.

Ich finde den Ansatz hier Tutorials durchzuarbeiten, bis man etwas zusamen gebastelt hat, was man versteht, sehr sinnvoll. Zumindest habe ich dabei mehr gelernt, als beim Durchorsten von Linuxcode. Bei heutigem Stand würde ich dort vermutlich mehr für mich rausholen können. Aber völlig ohne Vorwissen halte ich es für unmöglich zu verstehen, was dort für Designentscheidungen getroffen wurden und warum.

Da fällt mir ein: ich müsste das Projekt eigentlich auch mal wieder aufnehmen :D
 
Also ich finde die Idee super. Ich habe während meines Studiums auch ein kleines Betriebssystem programmiert, natürlich kein vollumfängliches, welches ich als Windows-Konkurrenz bezeichnen würde, aber immerhin eins, was von alleine startet, ein kleines Dateisystem implementiert und nahezu beliebigen C-Code ausführen kann.

Leider kann ich mich beim besten Willen nicht mehr an die Quellen erinnern. Aber als Einstieg findest du hinreichend viel Lektüre, wenn du einfach nur "Bootloader programmieren" googelst. Wenn du diese 512 Byte programmieren kannst und auch verstehst, warum du das getan hast, hast du mehr über PCs gelernt als manch einer in seinem Leben als Informatiker ;)

Ohne es jetzt im Detail durchgelesen zu haben wirkt aber diese Quelle vielversprechend um etwas zu lernen: http://www.henkessoft.de/OS_Dev/OS_Dev1.htm
 
Zum Erlernen der Assembler-Grundzüge haben wir in der Schule damals mit der Minimaschine gearbeitet. Hat den riesen Vorteil, dass Du dir beim Debuggen und "reinkommen" deutlich leichter tust, als direkt auf Hardware respektive Portable Executable zu arbeiten.
 
Wer im Web keine Anleitung findet, um sich Assembler für irgendeine Plattform selbst beizubringen, wird erst recht nicht die nötige Doku zur Plattform finden und verstehen, für die er ein kleines OS screiben will. Klingt wenig nett, aber davon bin ich fest überzeugt. :(

Um ein OS zu bauen, kann man fast komplett aufs _neu_ _Schreiben_ von Code in Assembler verzichten. Nur zum Debuggen des Codes, den der Compiler auswirft, kommt man nicht drumherum. Lernen muss man es also schon. Zum Lernen von Assembler ist ein neues OS allerdings ein sehr unglücklich gewähltes Spielobekt, da man sich am Anfang bei einem OS immer mit vielen Eigenheiten der Plattform rumschlagen muss, also schon mit genug neuen Dingen überschüttet wird. Eine neue Plattform mit Werkzeugen "erobern", die man ebenfalls kaum beherrscht, ist nicht clever.

Zum Lernen von Assembler rate ich anfang zu simplen Anwendungsprogrammen, danach zu etwas hardwarenahem. Wenn das langweilig wird, kann man mit einem OS-Kern anfangen.

SoDaTierchen schrieb:
Aber als Einstieg findest du hinreichend viel Lektüre, wenn du einfach nur "Bootloader programmieren" googelst. Wenn du diese 512 Byte programmieren kannst und auch verstehst, warum du das getan hast, hast du mehr über PCs gelernt als manch einer in seinem Leben als Informatiker ;)
Nunja, damit hat man aber in Sachen OS null gelernt. Für so Sachen wie einen Bootloader nimmt man besser was komfortables, fertiges daher. Grub hat z.B. die sehr angenehme Möglichkeit, mehrere Sachen an verschiedene Stellen in den Seicher laden zu können - perfekt um erstmal irgendwas zum Laufen zu bekommen.
 
Zuletzt bearbeitet:
Zurück
Oben