tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von PMTheQuick
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
10706
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PMTheQuick PMTheQuick ist offline Rookie
    Registriert seit
    May 2006
    Beiträge
    6
    Hi,

    ich hatte erst gerade kürzlich nen alten Schrotthaufen-PC gekriegt (ein zweiter, Test-PC) Jetzt habe ich ein eigenes kleines Betriebssystem durchgearbeitet, und habe noch ein 386-CPU Check eingebunden... Hier mal mein aktueller Code:

    boot.asm:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    
     
    org 0x7C00
     
    ; --------------------------------------------
    ; Unser Bootloader
    ; --------------------------------------------
     
    start:
     
    cli
    mov ax, 0x9000
    mov ss, ax
    mov sp, 0
    sti
     
    ; Bootlaufwerk aus DL speichern
    mov [bootdrv], dl
     
    ; Lade unseren Kernel
    call load
     
    ; Springe zu diesem Kernel
    mov ax, 0x1000
    mov es, ax
    mov ds, ax
    push ax
    mov ax, 0
    push ax
    retf
     
    ; --------------------------------------------
    ; Funktionen und Variablen
    ; --------------------------------------------
     
    bootdrv db 0
    loadmsg db "Loading...", 13, 10, 0
     
    ; Einen String ausgeben
    putstr:
    lodsb
    or al, al
    jz short putstrd
     
    mov ah, 0x0E
    mov bx, 0x0007
    int 0x10
    putstrd:
    retn
     
    ; Lade den Kernel vom Bootlaufwerk
    load:
     
    ; Diskdrive reset
    push ds
    mov ax, 0
    mov dl, [bootdrv]
    int 13h
    pop ds
    jc load
     
    load1:
    mov ax, 0x1000
    mov es, ax
    mov bx, 0
     
    ; Sektoren lesen
    mov ah, 2
    mov al, 5
    mov cx, 2
    mov dx, 0
    int 13h
    jc load1
    mov si, loadmsg
    call putstr
    retn
     
    times 512-($-$$)-2 db 0
    dw 0AA55h

    kernel.asm:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    
     
    ; --------------------------------------------
    ; Unser Kernel
    ; --------------------------------------------
     
    ;- Interrupt vorbereiten
    push dx
    push es
    xor ax, ax
    mov es, ax
    cli
    mov word [es:0x21*4], _int0x21
    mov [es:0x21*4+2], cs
    sti
    pop es
    pop dx
     
    mov ax, 1000h
    mov ds, ax
    mov es, ax
     
    start:
    ; Willkommen
    mov si, msg_welcome
    mov al, 0x01
    int 0x21
     
    ; CPU Check starten (Anfrage)
    mov si, msg_cpu
    mov al, 0x01
    int 0x21
    call getkey
     
    ; CPU Check Ausgabe
    mov si, msg
    mov al, 0x01
    int 0x21
    mov si, msg_cpu_check
    mov al, 0x01
    int 0x21
    call cpu_check
     
    ; Rebootanforderung
    mov si, msg
    mov al, 0x01
    int 0x21
    mov si, msg_boot
    mov al, 0x01
    int 0x21
     
    ; Taste abwarten
    call getkey
     
    ; Rebooten
    jmp reboot
     
    ; --------------------------------------------
    ; Funktionen und Variablen
    ; --------------------------------------------
     
    msg db "", 13, 10, 0
    msg_welcome db "Willkommen bei Cats 1.0!", 13, 10, 0
    msg_cpu db "Druecke eine beliebige Taste, um den CPU-Check durchzufuehren...", 13, 10, 0
    msg_cpu_check db "CPU-Check:", 13, 10, 0
    msg_is_386 db "Du hast eine 386-CPU!", 13, 10, 0
    msg_not_386 db "Du hast keine 386 CPU!", 13, 10, 0
    msg_boot db "Druecke eine beliebige Taste, um zu rebooten...", 13, 10, 0
    msg_1 db "1", 13, 10, 0
    msg_2 db "2", 13, 10, 0
    msg_3 db "3", 13, 10, 0
     
    ; Warte auf einen Tastendruck
    getkey:
    mov ah, 0
    int 016h
    ret
     
    ; Rebooten
    reboot:
    db 0EAh
    dw 0000h
    dw 0FFFFh
     
    ; CPU Check
    cpu_check:
     
    cli
    pushf
    pushf
    pop ax
    mov bx, ax
    and ax, 0x0FFF
    or bx,0x7000
    push ax
    popf
    pushf
    pop ax
    push bx
    popf
    pushf
    pop bx
    popf
    and ax, 0xF000
    cmp ax, 0xF000
    je not_386
    test bx, 0x7000
    jne is_386
    retn
     
    not_386:
    mov si, msg_not_386
    mov al, 0x01
    int 0x21
    retn
     
    is_386
    mov si, msg_is_386
    mov al, 0x01
    int 0x21
    retn
     
    ; --------------------------------------------
    ; Interrupts
    ; --------------------------------------------
     
    ; Text ausgeben
    _int0x21:
     _int0x21_ser0x01:
     cmp al, 0x01
     jne _int0x21_end
     
     _int0x21_ser0x01_start:
     lodsb
     or al, al
     jz _int0x21_ser0x01_end
     mov ah, 0x0E
     mov bh, 0x00
     mov bl, 0x07
     int 0x10
     jmp _int0x21_ser0x01_start
     _int0x21_ser0x01_end:
     jmp _int0x21_end
     
     _int0x21_end:
     iret

    Das funktioniert alles bestens! Nur... wie gehts weiter? Wie macht man Punkte auf den Bildschirm? Wie leert man den Bildschirm? Sorry, aber ich weiss das nicht, das es für NASM so gut wie gar kein deutsches Tutorial gibt! Ich verwende NASM... Bis jetzt alles prima! Und, hat jemand einen besseren Code, der das gleiche erreicht? Oder hat jemand ein NASM-Tut aus deutsch? Schon jetzt mal vielen, vielen Dank! Seit aber bitte nicht zu streng, werde dieses Jahr erst 11, behersche aber MASM, C++, C, PureBasic, PHP und MySQL... Und nen bissel NASM... Allerdings! Ich will NASM für das BS verwenden!

    Gruss
    PMTheQuick
    Sanna01 bedankt sich. 

  2. #2
    Avatar von tobee
    tobee tobee ist offline Grolba.com media
    Registriert seit
    Jul 2005
    Ort
    Karlsruhe
    Beiträge
    1.700
    Blog-Einträge
    131
    Das würde mich auch brennend interessieren, ich bin nämlich genau so
    weit weiss aber leider nicht wie's weiter geht.

    Hast du nach Tutorials schon auf http://www.robsite.de geschaut?

    Tobee
     

  3. #3
    TheAlchimist TheAlchimist ist offline Mitglied
    Registriert seit
    Jun 2006
    Ort
    Blomberg
    Beiträge
    13
    Hi, das Ganze ist eigentlich recht simpel. Es gibt da einen Interrupt mit der Nummer 10h, der für alles rund um die Graka zuständig ist.

    Bevor du allerdings punkten kannst (auf den Bildschirm ), musst du erstmal einen Grafikmodus einschalten. Für den Anfang empfehle ich den Modus 13h, das ist der, in dem die meisten DOS-Spiele laufen/liefen. Er hat eine Auflösung von 320x200 Punkten bei 256 Farben. Ist zwar nicht mehr ganz die Höhe der Zeit, aber dafür wenigstens standartisiert, d. H. er läuft auch ohne irgendwelche Treiber oder VESA...

    Die Initialisierung geht dann so:
    MOV AX,0013h ; Unterfunktion 00h, zuständig für die Videomodi, nach AH und der eigentliche Modus 13h nach AL

    INT 10h ; und ab dafür

    Um jetzt Pixel zu setzen gibt es zwar auch Interruptfunktionen, aber schneller und einfacher geht es, indem du direkt den Grafikspeicher ansprichst. Der fängt ab Adresse A000:0000 an und ist im Modus 13h genau 64000 Byte lang (320*200).

    Um jetzt einen Pixel zu setzen, schreibst du einfach einen Farbwert als 8-Bit Zahl an die Stelle im Grafik-RAM, wo es leuchten soll. 0 ist dabei schwarz, 255 weiss. (Das lässt sich über die Palette noch ändern, aber für den Anfang...) Die Koordinaten kannst ganz leicht in die entsprechende Adresse umrechnen: 320*Y+X=Offset. Übrigens werden die Pixel von oben links gezählt. Viel Spaß noch.
    TheAlchimist
    Geändert von TheAlchimist (12.06.06 um 01:53 Uhr)
     

  4. #4
    Genickzwirbler Genickzwirbler ist offline Grünschnabel
    Registriert seit
    Mar 2008
    Beiträge
    1
    hi

    ich bin neu hier und auch noch ein totaler anfänger was programierung und so angeht. wollte eigentlich mal n bisschen damit anfagnen, aber ich habe probs mit dem Netwide Assembler. wie kann ich das bei xp installieren? das geht bei mir irgendwie nicht.
    vllt bin ich ja auch einfach zu blöd dazu aber ich hoffe ihr könnt mir da ein bisschen weiterhelfen.

    gruß
    genick
     

  5. #5
    Big_Bertinator Big_Bertinator ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    14
    Schaut doch mal bei lowlevel.brainsware.org vorbei.

    ICh hoffe der link stimmt sonst googelt einfach


    da gibt es alles was ihr wissen müsst
     

  6. #6
    BassBox Tutorials.de Gastzugang
    dieser Thread ist zwar schon zimlich alt aber ich gebe meinen senf mal dazu:
    Da steht wie man system infos kriegt: http://www.codeplanet.eu/tutorials/a...ammierung.html

    da steht wir man pixel setzt und grafikmodi verwendet: http://www.codeplanet.eu/tutorials/a...g.html?start=2
    oder da stehen noch einige grafik funktionen:http://de.wikibooks.org/wiki/Interrupts_80x86/_INT_10
    für dateisysteme kenne ich keinte tutorials aber infos gibts überall.
    wer noch mehr infos über funktionen haben will:
    http://andremueller.gmxhome.de/referenz.html
    da stehen genug infos fürs erste. und wer in den protected mode will liest am besten das:
    http://www.fh-zwickau.de/doc/prmo/pm...text/index.htm
    http://www.tutorials.de/sonstige-spr...d-treiber.html
    lg BassBox
     

  7. #7
    Skini Skini ist offline Mitglied Gold
    Registriert seit
    Jun 2008
    Beiträge
    173
    Moin, eben auch schon in nem anderen Thread gesagt:
    www.lowlevel.eu die deutsch sprachige OS-Dev Community, da findest du (fast) alles was dur brauchst. Sonst auf osdev.net, die englische Schwester von lowlevel.eu
    Skini
     
    Neulich im IRC:
    <a> Da scheine ich selbst in Assembler besser zu runden als du in C. ;-)
    <b> for(rounded_data_size = data_size; rounded_data_size & 3; rounded_data_size++);
    <a> b löst das also brav iterativ, nur daß man dann Fortran nimmt, muß er noch lernen.
    <b> fortran(rounded_data_size = data_size; rounded_data_size & 3; rounded_data_size++);

    Ich bin eine Fee:
    Wenn ich die Hex-werte der Buchstaben meines Namens addiere, bin ich 1FE.

  8. #8
    Linux77418 Tutorials.de Gastzugang
    Hallo,
    ich bin jetzt zwar auch nicht der helt, was Betriebssysteme angeht, man sollte sich aber von assembler wegbewegen, da ein Fehler hier fatale Folgen haben kann. Den Kernel musst du so umbauen, dass er mit C oder C++ interagiert, das macht das ganze sicherer und deutlich einfacher. Wie du das machst, kannst du hier in diesem Link lesen: http://www.henkessoft.de/OS_Dev/OS_Dev1.htm
    Das sind 4 Teile, wenn du alle durch hast, kannst du in C Programmieren und alles läuft dann ganz normal in C. Du darfst aber auf keinen Fall ein Betriebssystem ausschließlich in Assembler schreiben.
     

  9. #9
    BassBox Tutorials.de Gastzugang
    was soll das problemm in assembler sein? in c hat das genau so schlimme folgen wenn du dich vertippst.
    Mit assembler kannst du deinen pc nicht "Zerstören" du schaffst es maximal deine festplatte zu leren oder ein paar sachen zu verstellen die beim neustart wieder da sind. Das mit c muss nich sein. Ich arbeite ausschließlich mit assembler und mein os Hat Einen Editor (auf grafik und ANSI aufbauend) mitlerweile auch einen dos Emulator und zahlreiche featurs zum programmieren die ziemlich nützlich sind(zum programmieren von programmen auf meinem os) ach ja hätte ich fast vergessen einen Grafik Editor für 16 farben bitmaps. So und warum bitte sollte ich c nehmen? Ich müsste für C jede Funktion definieren. Ich spar mir die arbeit und entwickle lieber so an meinem os weiter.
    Geändert von BassBox (15.01.11 um 16:30 Uhr)
     

  10. #10
    Sanna01 Sanna01 ist offline Grünschnabel
    Registriert seit
    Jun 2011
    Ort
    Mettman (NRW)
    Beiträge
    2
    Zitat Zitat von BassBox Beitrag anzeigen
    was soll das problemm in assembler sein? in c hat das genau so schlimme folgen wenn du dich vertippst.
    Mit assembler kannst du deinen pc nicht "Zerstören" du schaffst es maximal deine festplatte zu leren oder ein paar sachen zu verstellen die beim neustart wieder da sind. Das mit c muss nich sein. Ich arbeite ausschließlich mit assembler und mein os Hat Einen Editor (auf grafik und ANSI aufbauend) mitlerweile auch einen dos Emulator und zahlreiche featurs zum programmieren die ziemlich nützlich sind(zum programmieren von programmen auf meinem os) ach ja hätte ich fast vergessen einen Grafik Editor für 16 farben bitmaps. So und warum bitte sollte ich c nehmen? Ich müsste für C jede Funktion definieren. Ich spar mir die arbeit und entwickle lieber so an meinem os weiter.
    Kannst ud es hier Hochladen?
     

  11. #11
    SE Tutorials.de Gastzugang
    Könnte mal bitte irgend ein Mod diesen Thread ENDLICH closen ...
    Es geht nämlich echt auf den Keks wenn noch geantwortet wird obwohl der Thread mitlerweile 5 Jahre alt ist.
     

  12. #12
    Sanna01 Sanna01 ist offline Grünschnabel
    Registriert seit
    Jun 2011
    Ort
    Mettman (NRW)
    Beiträge
    2
    Zitat Zitat von SPiKEe Beitrag anzeigen
    Könnte mal bitte irgend ein Mod diesen Thread ENDLICH closen ...
    Es geht nämlich echt auf den Keks wenn noch geantwortet wird obwohl der Thread mitlerweile 5 Jahre alt ist.
    nö, kann niemand, wil niemand bock hat und dieser Kommentar ist
     

Ähnliche Themen

  1. Eigenes Betriebssystem...
    Von hhunderter im Forum Sonstige Sprachen
    Antworten: 6
    Letzter Beitrag: 21.07.11, 17:20
  2. Ein eigenes Betriebssystem fragen Thread
    Von cinema im Forum Sonstige Sprachen
    Antworten: 6
    Letzter Beitrag: 07.11.10, 11:10
  3. [Assembler] Eigenes Betriebssystem unter VirtualBox
    Von Jellysheep im Forum Sonstige Sprachen
    Antworten: 2
    Letzter Beitrag: 03.11.09, 09:15
  4. Eigenes Betriebssystem ohne Assembler
    Von xp_user im Forum Sonstige Sprachen
    Antworten: 2
    Letzter Beitrag: 05.08.07, 22:43