1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
10706
10706
EMPFEHLEN
-
04.06.06 15:53 #1
- 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
-
04.06.06 23:13 #2
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
-
12.06.06 01:48 #3
- 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.
TheAlchimistGeändert von TheAlchimist (12.06.06 um 01:53 Uhr)
-
05.03.08 21:51 #4
- 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
-
06.04.08 10:32 #5
- 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
-
18.12.10 16:59 #6BassBox 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
-
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
SkiniNeulich 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.
-
06.01.11 16:49 #8Linux77418 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.
-
06.01.11 22:22 #9BassBox 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)
-
-
14.06.11 14:29 #11SE 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.
-
Ähnliche Themen
-
Eigenes Betriebssystem...
Von hhunderter im Forum Sonstige SprachenAntworten: 6Letzter Beitrag: 21.07.11, 17:20 -
Ein eigenes Betriebssystem fragen Thread
Von cinema im Forum Sonstige SprachenAntworten: 6Letzter Beitrag: 07.11.10, 11:10 -
[Assembler] Eigenes Betriebssystem unter VirtualBox
Von Jellysheep im Forum Sonstige SprachenAntworten: 2Letzter Beitrag: 03.11.09, 09:15 -
Eigenes Betriebssystem ohne Assembler
Von xp_user im Forum Sonstige SprachenAntworten: 2Letzter Beitrag: 05.08.07, 22:43





Zitieren
Login




