Assembler und C OS



  • 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.



  • Hallo.

    Hab noch ein bisschen rum probiert, passieren tut bei diesem Code folgendes:

    lesen:
    mov ah, 00h
    int 016h

    cmp al, 27
    je reset

    cmp al, 13
    je NewLine

    NewLine:
    mov si, prompt
    call schreiben
    je EchoChar

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

    reset:
    db 0Eah
    dw 0000h
    dw 0FFFFh

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

    Computer startet bei Escape neu, bei Enter Zeilenvorschub. Dieser findet aber jetzt bei jeder anderen Taste auch statt. ich raffs nicht! 😕



  • lesen:
    mov ah, 00h             
    int 016h
    
    cmp al, 27		
    je reset ;Sprung, wenn al=27
    
    cmp al, 13		
    je NewLine ;Sprung wenn al=13
    
    ;<==hier kommts hin, wenn al weder 27 noch 13 ist. (ESC/Return)
    ;und was folgt da unten? richtig: das gleiche, wie wenn al=13 waere...
    
    NewLine:
    mov si, prompt
    call schreiben
    ;was soll das hier bewirken?
    ;das ZF ist beim Verlassen der Prozedur "schreiben" IMMER gesetzt.
    ;nun wird also nach echochar gesprungen, was aber sowieso die naechste Anweisung waere, die hier ausgefuehrt wuerde.
    ;=> Es ist 1. Sinnlos hier einen bedingten Sprung hinzusetzen und 2. ist das ZIEL dieses Sprungs unsinnig!
    je EchoChar
    
    EchoChar:
    mov ah, 0x0E		
    mov bx, 0x0007
    int 10h	
    ;und was soll das hier bewirken?
    ;das ZF ist auch hier immer gesetzt => da wuerde es ein normaler jmp auch tun...
    je lesen
    
    reset:			
    db 0Eah
    dw 0000h
    dw 0FFFFh
    

    Sry, aber irgendwie habe ich den Eindruck, dass wir so auf keinen gruenen Zweig kommen.
    Ich wuerde dir doch eher empfehlen, dass du dir erstmal ein ASM-Tutorial mit den Basics durchliest (Hallo Welt-Programme etc.) und hierbei aufpasst, dass du ausnahmslos alles richtig verstehst.
    zB. Aus den Asm-FAQ => ASM TUTORIALS => unter Intel Syntax Assembler Tutorials => ab "Assembler - Einführung 1"
    Die Codebeispiele nachher sind zwar fuer TASM, aber da die OpCodes die gleichen sind (die Assembler-Instruktionen sind andere!), denke ich, dass man das um die Basics zu lernen auf NASM uebertragen koennen sollte.

    Sollte dort etwas nicht klar sein, kannst du hier ja immernoch fragen. 🙂 (zB. falls du einen code absolut nicht uebertragen kannst)



  • TriPhoenix schrieb:

    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

    Hi die tar.bz2 kann mein WinZIP net entpacken, kannst du büdde eine ZIP machen? Würd mir sehr gerne deinen Memory Manager angucken 🙂



  • falsches Betriebssystem und mangelnde tools 😉

    http://a.triphoenix.de/trios-pre-alpha-0.0.1.zip



  • lesen:
    mov ah, 00h
    int 016h

    cmp al, 27
    je reset

    cmp al, 13
    je NewLine

    jmp lesen

    NewLine:
    mov si, prompt
    call schreiben

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

    reset:
    db 0Eah
    dw 0000h
    dw 0FFFFh

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

    Sollte jetzt doch so funktionieren, oder?
    Der Pc stürzt aber dann ab, sobald der Text (nachricht 1- 4)
    angezeigt wird. 😞



  • könntet ihr mir bitte helfen?
    was ist hier noch falsch?



  • Hi.

    Mit diesen spaerlichen Informationen ist dir einfach nicht zu helfen 😃
    Was heisst diesmal "der PC stuerzt ab"?
    Dein Code ist immerhin noch kein Windows, wo ein Absturz tausend Gruende haben kann - hier ist eine genaue Beschreibung wichtig, um den Fehler schnell einzugrenzen.

    So sehe ich deinem Code als moegliches Manko nur an, dass der Code direkt unter dem Label "EchoChar" nur ausgefuehrt wird, wenn die Returntaste gedrueckt wurde.



  • Im Kernel steht doch ziemlich am Anfang (siehe Seite 2)
    nachricht1, nachricht2, nachricht3

    Diese werden angezeigt, wenn das OS gestartet ist, der PC ängt sich aber dann sofort auf und macht gar nichts mehr und reagiert auch gar nicht mehr.



  • Ich habe mir die aktuellsten Versionen deines hier geposteten Codes kopiert/assembliert und werde das mal genauer unter die Lupe nehmen, sobald mein TestPC sich mal wieder einkriegt. 🙄



  • So, neue Festplatte rein - neues Programm zum "Disketten unbrauchbar machen" geschrieben und tatsaechlich noch eine Diskette gefunden, deren Sektor 1 und 2 noch intakt waren.
    Da habe ich dieses "OS" draufkopiert und es lief so weit alles problemlos: 😕
    Bei ESC => Neustart und bei ENTER => Naechste Zeile und "C:\>" ausgegeben.
    Auf andere Tasten wird wie bereits gesagt in der letzten Version deines Codes nicht reagiert.

    Hast du ausser im Code unter "lesen" wirklich sonst nirgendwo am Code veraenderungen vorgenommen?
    *Wilde Vermutung* Vielleicht auch schonmal mit einer anderen Diskette probiert? 😕



  • ja probiere es nochmal mit neuer diskette.
    danke für die mühe.
    🙂



  • 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂
    DANKE!Hat wirklich an der Diskette gelegen!



  • wie lautet der Zahlencode für die F2-Taste?
    Gibt es in Assembler eine Sleep_Funktion?
    Könntet ihr mir sagen, wie das funktioniert?
    DANKE!



  • Servus schrieb:

    wie lautet der Zahlencode für die F2-Taste?

    Die Tastaturcodes kannst du dir holen, indem du dir testhalber mal die Rueckgabewerte der BIOS-Funktion int 16h,00 ansiehst.
    Habe hier mal ein entsprechendes Programm geschrieben.

    Servus schrieb:

    Gibt es in Assembler eine Sleep_Funktion?

    Nein, nicht direkt.
    Im RM ist wohl die geschickteste Moeglichkeit, eine bestimmte Zeit zu warten, die Daten an Addresse 0000:046C auszulesen und zu schauen, ob sie sich aendern (Aenderung jede Sekunde 21*).


Anmelden zum Antworten