# Interrput Nummer 1Ah Funktioniert nicht!(NASM)



## TheComputaNerd (5. Februar 2011)

Hallo, ich schreibe gerade an einem kleinem Betriebssystem, welches nur eine kleine Shell haben wird und einpaar kleine Funktionen. Also ich meine, es soll nichts großes werden, nur ein kleines zeilenbasiertes OS mit einpaar kleinen Befehlen. Es soll 100% in NASM geschrieben werden. Momentan habe ich den Bootloader und die Shell. Jetzt arbeite ich an meinen Befehlen. Diese Befehle werden zusammen mit den Kernel programmiert sein. also sie sind keine einzelne Programme. Als erstes möchte ich ein Befehl programmieren, welches es die BIOS Zeit Anzeigt. Also auch mit Datum. Ich habe es mal programmiert, dann den Kernel in eine .bin Datei umgewandelt und zusammen mit boot.bin in eine img Datei umgewandelt und dann es in QEMU abgespielt. Leider: Es booten ja, aber wenn ich dann den Befehl eingebe, damit es die Zeit anzeigt, kommt nur wieder die Zeilenabfrage, nur eine Zeile rüber. Was habe ich falsch gemacht? Hier der Code:

```
...
mov ah, 0x02
int 0x1a
mov ah, 4h
int 0x1a
mov ah, 0ah
jmp main
...
```

Ich habe auch die Funktion Zeit setzen benutzt, und erst dannach Zeit lesen. Kam auch nichts raus! Gibt es auch einen anderen Zeitbefehl in NASM?


----------



## BassBox (5. Februar 2011)

Du gibst die zeit nicht aus. Du muss nachlesen, denn int 1Ah gibt die uhrzeit nicht aus. Hiersteht dass die rückgabewerte nur in den Universalregistern sin und du die noch ausgeben musst.
Und wenn du da keine Funktion dafür hast dann guck hier nochmal nach (ausgabe Interrupt int 10h)
Und Ich denke dass du mit deinem OS nur auf commad Basis nicht weit kommst. Irgend wann wirst auch du eine GUI(Graphic User Interface) Programmieren.  Mein OS hat: einen DOS-Emulator, Editor, sowas in der Art "Paint", führt binärprogramme aus  und hat einen File-manager für mein eigenes Dateisystem. Nur als info am Rande wie weit man kommen kann. Ist übrigens alles mit Graphischer Oberfläche 

LG
BassBox


----------



## TheComputaNerd (5. Februar 2011)

Ja, ich will auch nicht weit kommen. Ich will erstmal nur ein kleines OS machen. Egal, du meinst, dass ich diese ch, cl, dh und cf Register ausgeben soll. Ich weiß, wie man ein Zeichen ausgibt! Ich habe jetzt so was programmiert, dass es mal nur die Stunden ausgibt. Beim Bild unten wirst schon den Code sehen. Die Ausgabe von Qemu: Leider keine Uhrzeit! Was aber ich denn jetzt falsch gemacht?


----------



## BassBox (5. Februar 2011)

Komisch. Vieleicht ligts an Quem?  ich arbete mit ner Diskette und nem test pc. Wenn du ein Diskettenlaufwerk hast (und vieleicht ne diskette oder ne virtuelle) kannst du meinen OS- Emulator verwenden (vorausgesetzt dein PC ist ein windows pc oder hat einen Emulator).
Der Funktioniert auf jedenfall. Habe ich selber geschrieben 

Und Noch etwas: Du musst die Farbe des auzugebenden zeichen setzten (weil 0=schwartz) 15=weiß 
und setzt die videoseite auf bh=0 Das könnte später sonst noch zu problemen führen


----------



## TheComputaNerd (5. Februar 2011)

Ich benutze Linux 10.04(nur zur Info, dein Emulator ist ja eine .exe Datei). Egal, ich habe es auf VirtualBox probiert, ging auch nicht. Was rauskam wirst im Bild sehen. Außerdem schicke ich dir die img Datei vom OS, wo es die Stunden anzeigen sollte. Probiere die mal an deinem Emulator aus! Sie ist 512 Bytes groß, also genau 1 Sektor groß.


----------



## TheComputaNerd (5. Februar 2011)

Außer hier habe ich noch in anderen Computer Forums nachgefragt. Da kam einer und gab mir ein Beispiel Code, wie man Das mit der Zeit macht. Hier der Code:

```
mov ah, 0x02        ; Funktion 02
    int 0x1A            ; BIOS

    mov ax, cs          ; alle Segmentregister nach CS
    mov ds, ax          ; (eigentlich überflüssig, da bei
    mov es, ax          ;  Start CS, DS und ES identisch sind)

    mov di, Zeit        ; STOSB bezieht sich auf ES:DI

    mov al, ch          ; Stunde in BCD-Format
    shr al, 4           ; Zehner isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    mov al, ch          ; Stunde in BCD-Format
    and al, 0x0F        ; Einer isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    inc di              ; Doppelpunkt überspringen

    mov al, cl          ; Minute in BCD-Format
    shr al, 4           ; Zehner isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    mov al, cl          ; Minute in BCD-Format
    and al, 0x0F        ; Einer isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    inc di              ; Doppelpunkt überspringen

    mov al, dh          ; Sekunde in BCD-Format
    shr al, 4           ; Zehner isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    mov al, dh          ; Sekunde in BCD-Format
    and al, 0x0F        ; Einer isolieren
    or  al, 0x30        ; in ASCII-Zeichen umwandeln
    stosb               ; nach Zeit abspeichern

    mov si, Zeit        ; LODSB bezieht sich auf DS:SI
    mov cx, strlen      ; LOOP bezieht sich auf CX
print_bios:
    lodsb               ; ein Buchstabe nach AL
    mov ah,0x0E         ; Funktion 0E
    int 0x10            ; VGA-BIOS
    loop print_bios     ; CX mal

    mov ax, 0x4C00      ; Funktion 4C (Exit), Rückgabewert 0 (ok)
    int 0x21            ; MS-DOS

    Zeit: db "00:00:00 Uhr"
    strlen EQU $-Zeit
```

und das funktioniert! Nur das eine stunde zu früh angezeigt wird. aber es kann sein, dass in meinem bios so eine zeit angezeigt wird.


----------



## BassBox (7. Februar 2011)

Ok. Das habe ich nicht bedacht. Mann muss die zahlen ja noch ins ASCII format umwandeln. Und das mit den Segmenten ist irgendwie selbstverständlich. Diese Funktion arbeitet halt mit String-Ausgabe
und ich hätte das einfach direkt ausgegeben. Aber so gehts natürlich auch


----------



## TheComputaNerd (7. Februar 2011)

Ich habe bereits meine erste Version von meinem OS raus. Hier: http://www.lowlevel.eu/wiki/Comqos
Sag, wie es ist. PS: Ich bin 13 Jahre alt und Hochbegabt, ohne sch***. Und ich habe den Code nicht kopiert, sondern ihn gelernt und selber geschrieben. Kein Wunder, in IT bin ich Klassenbester, hab nur 1 und bin so der Vertretungslehrer für unsere IT-Kraft, wenn sie mal jemand anderen was erklärt, soll ich an ihren Computer z.B.: Die Excel Tabelle zu ende vollbringen und dann noch erklären, wie man das und das macht, ...


----------

