Print(..)



  • Hallo jungs!

    Schreibe gerade ein OS, bisher habe ich den Bootloder
    und den Kernel den man schon in C Programmieren kann.

    und da kommt meine frage:

    Und zwar ich will in C print benützen mit allem drum und dran, bisher sieht der ASM code so aus:

    GLOBAL _print
    _print: 
    push bp 
    mov bp,sp 
    push bx 
    push si 
    mov si,[bp+4] 
    
    call ausgabe 
    
    pop si 
    pop bx 
    pop bp 
    ret 
    
    ausgabe: 
                    lodsb                   ; load byte at ds:si into al 
                    or al,al                ; test if character is 0 (end) 
                    jz ausgabe@ende 
                    mov bx,0007 
                    mov ah,0eh              ; put character 
                    int 10h                 ; call BIOS 
                    jmp ausgabe 
    ausgabe@ende: 
    ret
    

    und der C code:

    print("Beispiel Text);
    

    hmm soweit so gut, aber wen ich z.B.

    print so verwende:

    print("Hallo\nZeile drunter\nZeile drunter");

    Sieht die ausgabe so aus:

    Hallo
         Zeile drunter
                  Zeile drunter
    

    Will aber das die die Untereinander sind!

    Könnt ihr mir helfen?? 😞 😞



  • Du musst \n\r schreiben statt \n. \n erzeugt lediglich den Sprung in eine neue Zeile. \r setzt dann den Cursor noch in die erste Spalte.



  • \r\n



  • Es ist doch im Endeffekt sowas von egal, ob man zuerst in die erste Spalte springt und dann in die nächste Zeile, oder ob man umgekehrt zuerst in die nächste Zeile und dann in die erste Spalte springt.
    Der Effekt ist der gleiche.



  • danke, wow!



  • Ich hab wohl das Forumtopic verwechselt...

    [ Dieser Beitrag wurde am 10.07.2003 um 20:29 Uhr von cd9000 editiert. ]



  • hey seit dem ich das jetzt Benütze Flimert es wider an meinem Bildschirm!

    vieleich hat es vorher auch, aber habe es nicht so sehr dan gesehn wie jetzt.

    Hier ist der Code von ASM:

    mov ax, 1000h ; Update die Segmentregister:
    mov ds, ax
    mov es, ax
    
    extern _main ;Aus dem C++ Code, für den Linker 
    
    start: 
    call _main ;Rufe main() auf 
    
    ;=============== Bildschirm Löschen (CLS) =======================
    
    GLOBAL _cls ;Die "Funktion" _cls als GLOBAL, für den Linker 
    _cls: 
    push bp           ;dies muss gemacht werden, 
    mov bp,sp         ;wird später bei der Parameter übergabe wichtig 
    
    call bildschirm_loeschen 
    
    pop bp 
    ret 
    
    bildschirm_loeschen: 
    mov ah,6 
    mov al,0 
    mov bh,7 
    mov cx,0 
    mov dh,24 
    mov dl,79 
    int 10h 
    
    mov ah,2 
    mov bh,0 ; video page 
    mov dh,0 ; row (y; 0 is top) 
    mov dl,0 ; col (x; 0 is left) 
    int 10h 
    ret
    
    ;=========================== Reboot ============================
    
    GLOBAL _Reboot ;Die "Funktion"
    _Reboot:
    push bp           ;dies muss gemacht werden, 
    mov bp,sp         ;wird später bei der Parameter
    
    db 0EAh
    dw 0000h
    dw 0FFFFh
    ret
    
    ;=========================== Shutdown ============================
    
    GLOBAL _Shutdown ;Die "Funktion" 
    _Shutdown:
    mov ax,$5301 
    xor bx,bx 
    int $15 
    
    mov ax,$530e 
    xor bx,bx 
    mov cx,01 
    int $15 
    
    mov ax,$530f 
    mov bx,1 
    mov cx,bx 
    int $15 
    
    mov ax,$5308 
    mov bx,1 
    mov cx,bx 
    int $15 
    
    mov ax,$5307 
    mov bx,1 
    mov cx,3 
    int $15 
    ret
    
    ;=========================== Print ============================
    
    GLOBAL _print
    _print: 
    push bp 
    mov bp,sp 
    push bx 
    push si 
    mov si,[bp+4] 
    
    call ausgabe 
    
    pop si 
    pop bx 
    pop bp 
    ret 
    
    ausgabe: 
                    lodsb                   ; load byte at ds:si into al 
                    or al,al                ; test if character is 0 (end) 
                    jz ausgabe@ende 
                    mov bx,0007 
                    mov ah,0eh              ; put character 
                    int 10h                 ; call BIOS 
                    jmp ausgabe 
    ausgabe@ende: 
    ret
    
    ;=========================== GetKey ============================
    
    GLOBAL _GetKey
    _GetKey: 
    push bp 
    mov bp,sp 
    mov ah, 00h 
    int 16h 
    mov sp,bp 
    pop bp
    xor ah,ah 
    push ax 
    ret
    

    und der C code:

    int main() 
    { 
        cls(); //Funktioniert
        print("Wilkommen bei Tilus 0.1\n\r");
        print("\n\r");
        print(" ___________________________________________________________\n\r");
        print("|                                                           |\n\r");
        print("|             1.] Boot                                      |\n\r");
        print("|             2.] Option                                    |\n\r");
        print("|             3.] Exit                                      |\n\r");
        print("|                                                           |\n\r");
        print(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\n\r");
        print("Auswahl: ");
        if(GetKey() == '3')
        {
            Reboot();
        }
        else
        {
        }
    }
    


  • Ich weiß nicht, ob es daran liegt, aber ich würde nach dem call _main noch rebooten oder ne Endlosschleife starten. Weil so wird doch nachdem main bearbeitet wurde nochmal ein cls durchgeführt und dann wird ret gestartet. Allerdings dürfte als Rücksprungadresse ja noch die von main auf dem Stack liegen, oder? Demnach wird wieder main aufgerufen, der Text nochmal ausgegeben, dann wieder cls, dann wieder Text...


Anmelden zum Antworten