tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
762
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    TheComputaNerd TheComputaNerd ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    33
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    ...
    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?
    Geändert von TheComputaNerd (05.02.11 um 09:40 Uhr)
     

  2. #2
    BassBox Tutorials.de Gastzugang
    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
    Geändert von BassBox (05.02.11 um 17:25 Uhr)
     

  3. #3
    TheComputaNerd TheComputaNerd ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    33
    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?
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Interrput Nummer 1Ah Funktioniert nicht!(NASM)-code.png   Interrput Nummer 1Ah Funktioniert nicht!(NASM)-fail.png  

     

  4. #4
    BassBox Tutorials.de Gastzugang
    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
    Geändert von BassBox (05.02.11 um 18:51 Uhr)
     

  5. #5
    TheComputaNerd TheComputaNerd ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    33
    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ß.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Interrput Nummer 1Ah Funktioniert nicht!(NASM)-epicfail.png  
    Angehängte Dateien Angehängte Dateien
     

  6. #6
    TheComputaNerd TheComputaNerd ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    33
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
     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.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Interrput Nummer 1Ah Funktioniert nicht!(NASM)-yay.png  
     

  7. #7
    BassBox Tutorials.de Gastzugang
    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
     

  8. #8
    TheComputaNerd TheComputaNerd ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    33
    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, ...
     

Ähnliche Themen

  1. NASM Syntaxprobleme
    Von BassBox im Forum Sonstige Sprachen
    Antworten: 0
    Letzter Beitrag: 07.12.10, 17:58
  2. Karte anzeigen, nicht die Nummer?
    Von Duellking im Forum PHP
    Antworten: 3
    Letzter Beitrag: 31.07.07, 12:25
  3. Select, welcher die etste nicht vorhandenen Nummer zurückgibt
    Von Krotty im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 19.08.04, 07:44
  4. Assembler - NASM läuft nicht! Newbie braucht Hilfe
    Von nepenthes im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 19.10.03, 20:28
  5. Nasm-tutorial
    Von akosch im Forum Sonstige Sprachen
    Antworten: 6
    Letzter Beitrag: 01.05.03, 21:01

Stichworte