Assembler / Computer Grundlagen gesucht

Ich kann dir jetzt zwar nicht spezifisch auf einen Intel-prozessor bezogen helfen, aber ich hab Assembler anhand des MSP430 von Texas Instruments erlernt. Das ist zwar ein Microcontroller und daher sind da schon einige Unterschiede aber die Grundstrukturen sind die gleichen.

Zu den Interrupts, da bist du dir ja nicht ganz sicher: und zwar gibt es eine Interruptvektortabelle, wo für jeden Port ein bzw. zwei Speicherbereiche reserviert sind. In diese Speicherbereiche schreibt man dann die Adresse der Funktion(auch Interrupt Service Routine -ISR - gennant) die aufgerufen werden soll. Wird ein Interrupt ausgelöst guckt der Prozessor in die Interruptvektortable wo die ISR ist und springt dahin. Nach erfolgreicher ausführung der ISR springt er an die Adresse zurück wo er war bevor er unterbrochen wurde. Das ist jetzt nur eine allgemeine Darstellung, zusätzlich gibt es noch so Faktoren wie Interrupt-Priorität, das z. B. ein Port eine höhere Interrupt-Priorität hat als der andere. Das würde bedeuten, wenn der Prozessor in einer ISR mit niedriger Prioriät ist kann diese durch einen Interrupt von höherer Prioriät unterbrochen werden, andersrum wäre es aber nicht so, da würde die ISR erst nach der anderen ausgeführt werden.

Wie gesagt, dass ist jetzt das Prinzip wie es auf einem Mikrocontroller läuft, ich vermute dass es auf einem Mikroprozessor ein bisschen anders funktioniert, auf einem MC muss ich meinen gesamten Speicher(Interruptvektortabelle, Stack Pointer, etc) komplett selber pflegen, ich denke mal dass es auf einem MP dynamschier sein wird.
 
Also, die interrupt vektortabelle kann nur im realmode angesprochen werden (in dem modus in dem du nach dem booten bist also 16bit code der auf einem 32 oder 64 bit prozessor ausgeführt wird) Im pmode kannst du keine ints ansprechen aber in VM86 wieder. mal angenommen du willst interrupt 21h definieren dann machst du folgendes:

Code:
mov ax,0
mov es,ax	 				;setze das extrasegment auf 0
cli 			            ;schalte interrupts zur sicherheit aus
mov word [es:4*21h],int_21h	;schiebe die offset adresse der funktion int_21h in die vektor tabelle
mov word [es:4*21h+2],cs	;schiebe das codesegment in die vektor tabelle
mov ax,09000h                         
mov ss,ax 					;setzte Stack
mov sp,100				    ;setzte Stack
sti 						;schalte interrupt rotine wieder ein

So wenn du jetzt int 21h aufrufst dann führt der pc die von dir programmierte funktion int_21h aus.
du kannst auch andere ints setzten indem du einfach das 21h in den eckigen klammern durch die hexadezimale intnummer ersetzt zb. 60h.

mov word [es:4*int nummer],funktion die beim aufrufen des ints ausgeführt werden soll
mov word [es:4*int nummer+2],cs

das ist das prinzip.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
vielen Dank nochmal für eure Hilfe!
am Ende hab ich meinen Kernel doch zu was gebracht (siehe Augsburger Allgemeine)

Jetzt stehe ich vor neuen Problemen:

1. Ich brauch einen Diskettentreiber
Da mein Programm immer größer und größer wird, reicht der Platz im Bootsektor nicht mehr aus. Also würd ich gerne Variablen, die sehr lange sind, von der Diskette laden.

2. Überlege ich mir, ob ich den Kernel in C++ weiterprogrammiere, da ich komplizierte Befehle zum steuern des Kernels verwenden werde. (irgendjemand hat das hier schon mal hingekriegt) Würde mir das jemand raten, oder soll ich eher bei Assembler bleiben?

3. Ich habe irgendwie keinen Stack
ich verwende zwar Interrrupts und call-Aufrufe, habe aber keinen Stack definiert.
Kann mir mal jemand sagen, wie ich das mache?

Grüße,
Cpp-Freak
 
Zuletzt bearbeitet:
Assembler / Computer Grundlagen ges ...

du brauchst einen Bolzplätze und musst fat12 implementieren. Viel Spaß ;) Ist ne mortz Arbeit
LG
BassBox
 
Hallo,
eine Frage:
meinst du, dass ich viel Platz brauche?
die 2.: hast du eine idee, wie ich das implementieren kann?
ich würds am liebsten selbst schreiben, dann verstehe ichs auch...
Cpp-Freak
P.S. mein Kernel hat zurzeit genau 814 Zeilen (mit Tastaturtreiber), da soll es doch nicht an so was scheitern....
 
Du brauchs als aller erstes einen Bootloader. Der Kommt auf den ersten sektor der diskette
(max 512byte). Dieser hat eine Boot signatur und enthätl den code der dein kernel in den RAM lädt
(int 13h) und es mit einem Far-Jump startet. Falls du Infos zum OS-DEV brauchen sollstest kannst du dich bei mir mit einer Privat nachircht melden.
LG
BassBox
 
ok,
ich glaube, ich muss es genauer erklären...
also:
ich will nicht den kernel laden, sondern der kernel soll (bei bedarf) die benötigten kernelteile laden.
z.B.: Variablen bzw. lange Stringketten,die mit der Eingabe verglichen werden
(der Kernel bleibt im bootsektor)
die Daten will ich dann mit einem anderen selber geschriebenem Programm auch auf die Diskette laden.
(z.B. 'schreibe an stelle xxx den Wert xxx)

außerdem , kannst du mir bitte sagen, wie das jetzt mit dem stack geht...
bis morgen,
Cpp-Freak
 
ok,
ich habe grad gemerkt, dass mein kernel über 512 byte groß ist.......
ok, ich muss also nen bootloader programmieren.
wie geht das?:)
Cpp-Freak
 

Neue Beiträge

Zurück