Assembler und C OS



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



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


Anmelden zum Antworten