Verständnis Problem mit Registern
-
Hi,
ich versuche grade Assembler zu lernen.
Ich habe diese Tutorial gefunden: http://andremueller.gmxhome.de/toc.html
was ganz gut aussieht.Und ich verstehe das mit den Segmentregistern/Datensegment überhaupt nicht und dieser Begriff "OFFSET" sagt mir auch nichts. Kann mir das jemand kurz erklären und vllt ein kleines Beispiel dazu? Oder mir halt ein guten Link geben?
Habt ihr vllt noch eins Tutorial was ein bisschen einfacher ist?
Ich möchte Assembler lernen um ein kleines OS zu schreiben bloß weiß ich nicht ob das TASM oder wie das noch hieß überhaupt dafür geeignet ist.
-
Das ist uralt, brauchst du in der Form jetzt nicht unbedingt. Such dir ein moderneres Tutorial. Dann wirst du vielleicht später auch das hier verstehen.
-
Ok du kennst nicht zufällig eins oder?
Was soll ich denn suchen bei google?
Assembler modernes Tutorial? Ich möchte ja ein OS schreiben welche Sprach ist gut dafür?
-
CraftPlorer schrieb:
ich versuche grade Assembler zu lernen.
Ich habe diese Tutorial gefunden: http://andremueller.gmxhome.de/toc.html
was ganz gut aussieht.Ich habe mal ein paar Blicke hineingeworfen und halte es für eine didaktsche Katastrophe. Der Autor hat sich viel Mühe gemacht und Fehler habe ich nicht gefunden. Aber es wird zu viel zu früh gebracht.
Und ich verstehe das mit den Segmentregistern/Datensegment überhaupt nicht und dieser Begriff "OFFSET" sagt mir auch nichts. Kann mir das jemand kurz erklären und vllt ein kleines Beispiel dazu? Oder mir halt ein guten Link geben?
Beim 8086-Prozessor (bzw. im Real Mode) sind alle Register maximal 16 Bit groß. Du kannst also (eigentlich) mit diesem Prozessor nur 2^16 = 65536 Speicherstellen ansprechen. Das sind 64 KiB (Kilobyte). Das konnte damals jeder Heimcomputer. Ein Verkaufsargument für den IBM-PC war, dass er bis zu 1048576 (1 MB) Speicherstellen ansprechen kann. Wie macht er das? Um 1 MB an Speicher ansprechen zu können, braucht man 20 Adressleitungen zu den Speicherchips. Die 16 Bits der Register werden nun mit weiteren 16 Bits eines anderen Registers zu 20 Bit aufgepeppt, so dass eine 20-Bit-Adresse die CPU verlassen kann. Dieses andere Register nennt man Segmentregister.
Wir haben also zwei Register, die bei der Adressenbildung beteiligt sind: das Segmentregister und das Offsetregister. Ein Segmentregister ist bei jeder Adressenbildung beteiligt, auch wenn es aus dem Assemblercode nicht ersichtlich ist. Bei einem '
mov ax, [di]
' z. B. ist das DS-Register beteiligt. Bei einem 'lea si, [bp-4]
' ist das SS-Register beteiligt. Bei einem 'movsb
' sind sogar zwei Segmentregister beteiligt: DS und ES. Will man die Beteiligung eines bestimmten Segmentregisters erzwingen: 'mov ax, es:[di]
'.Die Aufpeppung der Adresse geschieht nun in einer Weise, dass sich die Segmente überschneiden können. Darum solltest Du Dich als Anfänger noch nicht kümmern.
Habt ihr vllt noch eins Tutorial was ein bisschen einfacher ist?
http://www.borncity.de/Library/FreeLib.htm
http://www.assembler.my100megs.com/inhalt.htmAber auch hier gibt es Lücken, die sich für einen Anfänger als Stolpersteine erweisen können.
Ich möchte Assembler lernen um ein kleines OS zu schreiben bloß weiß ich nicht ob das TASM oder wie das noch hieß überhaupt dafür geeignet ist.
Normalerweise traut man sich an ein OS, wenn man sich sehr gut in der Elektronik und im Programmieren auskennt
. Wichtig ist aber, dass Du Dir die in den Büchern verwendeten Programme auch wirklich besorgst und damit arbeitest und Versuche anstellst. Es ist absolut sinnlos, als Anfänger ein TASM-Lehrbuch mit dem MASM oder gar dem NASM durcharbeiten zu wollen.
viele grüße
ralph
-
CraftPlorer schrieb:
...bloß weiß ich nicht ob das TASM oder wie das noch hieß überhaupt dafür geeignet ist.
Aber ja, Tasm ist für den Einstieg geeignet, bringt eine ganz brauchbare Doku mit und auch nette Zusatztools.
Es ist aber viel einfacher, erstmal mit debug einzusteigen. Leider braucht man aber bei 64bit Systemen einen Dosemulator, weil bei 64 Bit kein Virtual Mode mehr zur Verfügung steht. Wenn du ein 32 Bit Windows hast, dann müsste ein "Windowstaste drücken, debug eingeben und mit Return bestätigen" funktionieren.
Segmente sind sowas wie Stockwerke in einem Hochhaus. So hast du dann Addressregister für Hausnummern und Adressregister für Stockwerke. Nur das die Stockwerke eben auch mal überlappen können - das ist aber eine gewisse Rechnerei, die Intel sich ausgedacht hat, nämlich
Segmentregister mal 16 - das ist bei 16Bit Hex FFFF * 16 = FFFF0Toll, nicht? Einfach eine Null drankleben!
Um zur richtigen Hausnummer zu kommen wird noch der sogenannte OFFSET draufaddiert. Also das, was gerade im 16Bit Instruktionpointer (IP) angezeigt wird. Die Speicheransteuerung ist in debug und fasm viel einfacher gelöst, du schreibst einfach mov ax, Zahl und landest automatisch bei der Adresse(Hausnummer im Hochhaus) von Zahl.
Schreibst du dagegen mov ax,[Zahl] dann geht es um den Bewohner der Studentenbude bzw. um konkreten Wert der Zahl, also z.B. 42.Ein kleines Debug Tutorial: http://swlx01.hs-esslingen.de/vorl/rt2/debug.pdf
Man ist gut beraten, sich die derzeit im Handel verfügbaren (deutschsprachigen) Assemblerbücher zu besorgen (solange sie nicht vergriffen sind).
Eine gute Anlaufstelle für OS Experimente ist die Lowlevelseite:
http://www.lowlevel.eu/wiki/Hauptseite
und für Entwicklungskits und Mikros
http://www.mikrocontroller.net/weiter wertvolle Hilfen zu Programmiertechniken Betriebsystemaufbau findest du verlinkt hier in der Assembler FAQ
Der der Großteil der Posts im Asmforum Anfängerfragen sind, kann man auch bei der Durchsicht der Anfragen und Antworten einiges lernen.