Assembler und C OS



  • hi,
    find ich ne tolle sache das mit dem os. mich wuerde mal der quellcode interessieren. koenntest du den zum download freigeben oder ist es nur fuer dich privat gedacht?

    gruss
    msp



  • Nun, gedacht ists nur für mich bzw. es wird wohl kaum jemand nutzen sonst 😉 Aber den Code kannste gerne angucken:
    http://a.triphoenix.de/trios-pre-alpha-0.0.1.tar.bz2



  • TriPhoenix schrieb:

    detlef schrieb:

    TriPhoenix schrieb:

    dann muss man nur die FUnktionen selber schrieben, die tatsächlich ein Zeichen ausgeben.

    hier muss aber asm ins spiel kommen denn c kennt keine interrupts und ohe die kann man nix ausgeben (ohne os..)

    Das komtm ganz drauf an. Wenn du ein Kernel-printf machst brauchst du bestimmt keinen Interrupt 🙂 Für User-Mode-Libraries ists ja noch zu früh, dazu muss erstmal ein Kernel stehen 🙂 Also meine SimpleConsole z.B: ist komplett in C geschrieben soweit (ist allerdings auch nur Ausgabe)

    ... 😋
    so gesehn kann man das ja auch alles in c schreiben aber an irgenteiner stelle in irgenteinem code von irgentwo muss auch nur ein geringer futzel in asm sein oder wie bitte gibst du sonst was aus? sag jetzt bitte nicht sowas wie my_printf("blaa");

    denn dieses my_printf() muss ja auch definiert sein und dort kann nicht alles c sein denn sonst kann man ja asm komplet weglassen... und komm mit jetzt bitte nicht mit inline-asm! :p 🙄



  • detlef schrieb:

    so gesehn kann man das ja auch alles in c schreiben aber an irgenteiner stelle in irgenteinem code von irgentwo muss auch nur ein geringer futzel in asm sein oder wie bitte gibst du sonst was aus? sag jetzt bitte nicht sowas wie my_printf("blaa");

    denn dieses my_printf() muss ja auch definiert sein und dort kann nicht alles c sein denn sonst kann man ja asm komplet weglassen... und komm mit jetzt bitte nicht mit inline-asm! :p 🙄

    Nein, ganz einfahc mit Zeigern. Ich bin bisher im Flat-Mode, also einfach z.B: char *foo = (char *)0xb80000; *foo = 'A'; *(foo+1) = 0x07; Und schon hat man ein graues A 🙂



  • hi.

    hab nen bootloader und nen kernel geschrieben.
    mal ne frage.
    wenn mein os gestartet ist, dann kann man es durch drücken einer Taste
    wieder neu starten. jetzt wollte ich machen, das es nur neu gestartet wird,
    wenn die escape taste gedrückt wird.brauche ich dazu schon einen treiber?
    wie kann ich es machen?



  • Hi.

    Ich nehme an, das ganze laeuft im RealMode? => int 16h



  • hab ich eigentlich gemacht.
    geht aber irgendwie nicht.



  • Poste mal etwas code... 🙄



  • lesen:
    mov ah, 00h
    int 016h

    cmp al, 27
    jmp reset

    reset:
    db 0Eah
    dw 0000h
    dw 0FFFFh

    was funktioniert hier nicht?



  • servus schrieb:

    ...
    cmp al, 27
    jmp reset
    ...

    Das ist ein einfacher jump. Der wird immer ausgefuehrt - egal was in al steht.
    Hier muesstest du einen bedingten Sprung-befehl einsetzen.
    Anbieten wuerde sich "je" (jump if equal).



  • ich werde es probieren.
    poste dann das ergebnis.
    auf jeden fall danke!



  • es geht immer noch nicht.
    poste jetzt ganzen code.

    Bootloader:

    org 0x7C00

    start:
    cli
    mov ax, 0x9000
    mov ss, ax
    mov sp, 0
    sti

    mov [bootdriv], dl

    call load

    mov ax, 0x1000
    mov es, ax
    mov ds, ax
    push ax
    mov ax, 0
    push ax
    retf

    bootdriv db 0
    loadmsg db "Lade...",13,10,0

    putstr:
    lodsb
    or al,al
    jz short putstrd
    mov ah,0x0E
    mov bx,0x0007
    int 0x10
    jmp putstr
    putstrd:
    retn

    load:
    push ds
    mov ax, 0
    mov dl, [bootdriv]
    int 13h
    pop ds
    jc load

    load1:
    mov ax,0x1000
    mov es,ax
    mov bx, 0
    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

    Und der Kernel:

    mov ax, 1000h
    mov ds, ax
    mov es, ax

    start:
    mov si, nachricht
    call schreiben

    mov si, nachricht2
    call schreiben

    mov si, nachricht3
    call schreiben

    call lesen

    nachricht db "Willkommen...",13,10,0

    nachricht2 db "Erstellt am 21.Oktober 2003",13,10,0

    nachricht3 db "Druecken Sie Escape um den Computer neu zu starten!",13,10,0

    schreiben:
    lodsb
    or al, al
    jz short schreiben_d
    mov ah, 0x0E
    mov bx, 0x0007
    int 0x10
    jmp schreiben

    schreiben_d:
    retn

    lesen:
    mov ah, 00h
    int 016h

    cmp al, 27
    je reset

    reset:
    db 0Eah
    dw 0000h
    dw 0FFFFh

    Bin für die Hilfe sehr dankbar.
    Es startet aber immern noch bei jeder Taste neu???!!!



  • Was sollte auch passieren, als dass neu gestartet wird?
    Dein Code enthaelt ueberhaupt keine Alternative. 😕
    Wenn du mal genau hinsiehst, wird dir auffallen, dass der code unter dem label "reset:" auch jetzt noch IMMER ausgefuehrt wird, unabhaengig davon, welche Taste gedrueckt wird (bzw. welchen Wert al hat).
    Wird ESC gedrueckt, wird der Jump zwar ausgefuehrt, das aendert aber nichts, da nur zur naechsten Instruction gesprungen wird.



  • bin noch ein großer anfänger.
    was soll ich jetzt tun?
    einfach eine alternative einfügen?



  • cmp al, 27 
    je reset 
    
    ;hier waere einzufuegen, was geschehen soll, wenn NICHT ESC gedrueckt wurde...
    ;zB. koennte zurueckgesprungen werden, um noch einmal eine Taste Druecken zu lassen...
    jmp lesen
    
    reset: 
    db 0Eah 
    dw 0000h 
    dw 0FFFFh
    


  • probier ich gleich mal aus.
    Danke Dir!



  • Funktioniert!DANKE!!!!
    Hab aber schon wieder ein Problem: 😞

    wollte machen, dass bei der Enter-Taste ein Zeilenvorschub stattfindet, es funktioniert zwar, aber der Computer startet schon wieder bei jeder anderen Taste neu! Was soll ich tun?

    lesen:
    mov ah, 00h
    int 016h

    cmp al, 27
    je reset

    cmp al, 13
    je NewLine

    jmp EchoChar

    NewLine:
    mov si, prompt
    call schreiben
    jmp lesen

    EchoChar:
    mov ah, 0x0E
    mov bx, 0x0007
    int 10h

    reset:
    db 0Eah
    dw 0000h
    dw 0FFFFh

    prompt db 13, 10, 'C:\>', 0

    Danke für die Hilfe.



  • Eigentlich wieder das gleiche Problem:

    EchoChar:
    mov ah, 0x0E		
    mov bx, 0x0007
    int 10h	
    ;<==Hier >Markierung<
    
    reset:			
    db 0Eah
    dw 0000h
    dw 0FFFFh
    

    Wenn du nichts weiter (zB. eine jmp-Anweisung zu "lese", um den naechsten Char einzulesen) ans Ende der EchoChar-"Prozedur" (siehe Markierung) setzt, wird einfach stur der naechste OpCode, den die CPU findet, ausgefuehrt - egal ob im Quelltext ein Label dazwischensteht oder nicht.
    In diesem Fall ist der naechste OpCode nach der Zeichenausgabe via int 10h nunmal "db 0Eah (usw...)", was den Neustart herbeifuehrt.



  • EchoChar:;
    mov ah, 0x0E
    mov bx, 0x0007
    int 10h
    jmp lesen

    reset:;
    db 0Eah
    dw 0000h
    dw 0FFFFh

    sollte so gehen, oder?
    der computer stürtzt aber jetzt immer ab 😕

    Was ist eigentlich der Zahlencode für die F1 Taste?



  • Zum Code: Jo, sollte so gehen.
    Zum Absturz: Absturz ist nicht immer gleich Absturz. 😃 Eine etwas genauere Beschreibung der Vorgaenge waere hilfreich.
    Zu F1: int 16h gibt ax=3B00h zurueck.


Anmelden zum Antworten