Autor Thema: Bios Interrupts  (Gelesen 2912 mal)

Klabautermann

  • Beiträge: 1
    • Profil anzeigen
Gespeichert
« am: 03. September 2011, 12:41 »
Hallo,
so kann ich ja ein Zeichen z.b. ein Zeichen auf meinem Bildschirm darstellen.

mov al, [si]            ; Erstes Zeichen aus si nach al
mov ah,0x0e            
int 0x10                ; Erstes Zeichen aus si ausgeben

Aber was genau passiert da ?  (Und kann man selbst ein BIOS programmieren ? )
Gibt es eine möglichkeit die Funktion ah,0x0e vom Interrupt 0x10 zu debuggen ?
Mich würde mal interessieren was der PC da genau macht.


Und was genau passiert intern in meinem PC naja ok das in Prozessor Register ah wird der Wert 0x0e kopiert.

Und noch eine Frage zum Prozessor während ich das hier mache mov ah,0x0e  passieren in meinem PC ja auch noch anderen Sachen. Gibt es die Datenleitung ah öfters als nur einmal in meinem Prozessor ?


[ Ich hoffe mal man kann verstehen was ich meine mir geht es eigentlich nur darum um zu verstehen wie ein Computer generell funktioniert, im Prinzip sind es ja nur Millionen von Gattern und so die geschickt aneinander geschaltet sind (sag ich einfach mal so).

Ein Computer ist auch vielleicht etwas zu schwert zu verstehen oder ? Man kann doch bestimmt einen Taschenrechner selbst zusammenlöten der vielleicht nicht rechen kann aber ein Zeichen im Display ausgeben kann. ]
« Letzte Änderung: 03. September 2011, 12:43 von Klabautermann »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. September 2011, 14:49 »
Hi,

der Interrupt führt im Prinzip nur Code aus, der das Zeichen in einen Puffer im Video RAM schreibt. Dieser ist (im Text-Modus) in der Regel an der linearen Adresse 0xb8000 eingeblendet. Die Position an die sich der Cursor befindet, wird aus der BIOS Data Area (=einfach ein paar Variablen an einer bestimmten Stelle im Speicher) ausgelesen (und anschließend aktualisiert.) Die Ausgabe im Protected Mode ist im Artikel Textausgabe beschrieben. Diese Methode lässt sich im Prinzip auch im Real Mode anwenden, wenn du das Segment 0xb800, das der linearen Adresse entspricht, verwendest.

Zu der Sache mit dem Wert 0x0e: Der Befehl int 0x10 springt zu einem Code, der mittels Vergleichsoperationen schaut, welcher Wert in AH steht, und daraufhin unterschiedlichen anderen Code ausführt. Mit Gattern/Datenleitungen hat das noch nichts zu tun.

Du kannst diese Funktionen relativ einfach nachprogrammieren. Ein vollständiges BIOS zu programmieren ist allerdings wesentlich komplizierter, weil dieses ja auch die Hardware initialisieren muss. Wenn du das nachvollziehen willst, kannst du z.B. mit dem Bochs debugger mal durch das BIOS single-steppen. Aber vorher solltest du dir mal den Code vom VGABIOS anschauen, das in Bochs verwendet wird. Die Funktion biosfn_write_teletype ist für die Ausgabe zuständig. Der Code ist schon in C-Form ziemlich obskur. In Assembler wird der sicherlich nicht einfacher zu verstehen.
« Letzte Änderung: 03. September 2011, 14:51 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. September 2011, 15:28 »
SeaBIOS (das BIOS, das unter anderem qemu benutzt) ist in C geschrieben und relativ gut lesbar. Dort reinzuschauen ist vielleicht hilfreicher als die Binary zu debuggen. Als Video-BIOS auch das von bochs benutzt, das teils C, teils Assembler ist. Aber auch Assemblersource lässt sich besser lesen als disassemblierte Binaries.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. September 2011, 12:10 »
Hallo,
so kann ich ja ein Zeichen z.b. ein Zeichen auf meinem Bildschirm darstellen.

mov al, [si]            ; Erstes Zeichen aus si nach al
mov ah,0x0e            
int 0x10                ; Erstes Zeichen aus si ausgeben

Aber was genau passiert da ?  (Und kann man selbst ein BIOS programmieren ? )
Gibt es eine möglichkeit die Funktion ah,0x0e vom Interrupt 0x10 zu debuggen ?
Mich würde mal interessieren was der PC da genau macht.


Und was genau passiert intern in meinem PC naja ok das in Prozessor Register ah wird der Wert 0x0e kopiert.

Und noch eine Frage zum Prozessor während ich das hier mache mov ah,0x0e  passieren in meinem PC ja auch noch anderen Sachen. Gibt es die Datenleitung ah öfters als nur einmal in meinem Prozessor ?


[ Ich hoffe mal man kann verstehen was ich meine mir geht es eigentlich nur darum um zu verstehen wie ein Computer generell funktioniert, im Prinzip sind es ja nur Millionen von Gattern und so die geschickt aneinander geschaltet sind (sag ich einfach mal so).

Ein Computer ist auch vielleicht etwas zu schwert zu verstehen oder ? Man kann doch bestimmt einen Taschenrechner selbst zusammenlöten der vielleicht nicht rechen kann aber ein Zeichen im Display ausgeben kann. ]

mov al, [si]
Dieser Befehl holt in das AL-Register ein Byte von der Adresse die in DS:SI enthalten ist.
Beispiel: Im DS-Register ist die Segmentadresse 152D (hex) enthalten und im SI-Register ist die Offset-Adresse Null enthalten.
In der Adresse 152D:0000 ist das Byte 41 (hex) enthalten. Mit "mov al, [si]" wird in das AL-Register der Wert 41 (hex) geholt.

mov ah,0x0e
Dieser Befehl holt in das AH-Register den Wert 0E (hex).

int 0x10
Bei diesem Softwareinterrupt wird aus der Adresse in 10 (hex) mal 4 eine Vektoradresse (OFFSET(low/high), SEGMENT(low/high)) geholt zu der gesprungen wird. (Rücksprungadresse wird auf den Stack geschoben.) Dort wird die Ausführung bis zu einem "IRET" fortgesetzt und danach wird unmittelbar nach dem int-Befehl weiter gemacht.

Wie "PorkChicken" es schon erwähnte wird bei der Funktion 0E der Inhalt vom AL-Register an der aktuellen Cursorposition ausgegeben.
Das könnte z.B. so passieren:
cmp  ah, 0Eh
jz short P1
..
...
.....
P1:
push ds
push es
push bx
push si
push di
push ax
mov  ax, 0B800h    ; Segmentadresse Text-Bildschirm(color)
mov  es, ax
mov  ax, 40h       ; Segmentadresse BIOS-Variablen
mov  ds, ax
mov  bx, 4Ah       ; Offsetadresse für Anzahl der Bildschirmspalten
mov  si, 50h       ; Offsetadresse für Cursor-Position
mov  bx, [bx]      ; Anzahl der Bildschirmspalten
mov  ax, [si]      ; Cursor-Zeile
add  bx, bx
mul  bx
mov  bx, [si+2]    ; Cursor-Spalte
add  bx, bx
add  ax, bx
mov  di, ax        ; Zeile * (Zeilenlänge * 2) + (Spalte * 2)
pop  ax
stosb
pop  di
pop  si
pop  bx
pop  es
pop  ds
.....
....             ; ....nun wird auch noch der Cursor weiterbewegt....
...

BIOS-Variablen:
http://www.tu-chemnitz.de/informatik/RA/news/stack/kompendium/vortraege_96/BIOS/appendix.html

Beim Textbildschirm hat jedes Zeichen zwei Bytes: ASCII + Attribut(Farbe)
http://en.wikipedia.org/wiki/VGA_compatible_text_mode

Dirk
« Letzte Änderung: 05. September 2011, 12:31 von freecrac »

 

Einloggen