Bitte um Hilfe



  • Guten Abend,

    ich hab begonnnen das Tutorial auf http://www.henkessoft.de/OS_Dev/OS_Dev1.htm durchzugehen, und wollte den Code im Abschnitt 'Eigene Experimente' erweitern.

    mov ax, 0x07C0  ; set up segments
      mov ds, ax
      mov es, ax
    
      mov si, welcome
      call print_string
    
    loop:
      mov si, prompt
      call print_string
    
      mov di, buffer
      call get_string
    
      mov si, buffer
      cmp byte [si], 0  ; blank line?
      je loop           ; yes, ignore it
    
      mov di, cmd_hi    ; "hi" command
      call strcmp
      jz .helloworld
    
      mov si, buffer
      mov di, cmd_help  ; "help" command
      call strcmp
      jz .help
    
      mov si, buffer
      mov di, cmd_questionmark  ; "?" command
      call strcmp
      jz .help
    
      mov si, buffer
      mov di, cmd_exit  ; "exit" command
      call strcmp
      jz .exit
    
    ; ================================================================= ;
      mov si, buffer
      mov di, cmd_change_prompt  ; "change prompt" command
      call strcmp
      jz .change_prompt
    ; ================================================================= ;
    
      mov si,badcommand
      call print_string
      jmp loop 
    
    .helloworld:
      mov si, msg_helloworld
      call print_string
    
      jmp loop
    
    .help:
      mov si, msg_help
      call print_string
    
      jmp loop
    
    .exit:
      mov si, msg_exit
      call print_string
      jmp 0xffff:0x0000  ; Reboot
    
    ; ================================================================= ;
    .change_prompt:
      mov si, msg_change_prompt
      call print_string
    
      mov di, prompt
      call get_string
    
      jmp loop
    ; ================================================================= ;
    
    welcome db 'HenkesSoft 0.01 (version from Mar 14, 2009)', 13, 10, 0
    msg_helloworld db 'Hello World!', 13, 10, 0
    badcommand db 'Command unknown.', 13, 10, 0
    prompt db '>', 0
    cmd_hi db 'hi', 0
    cmd_help db 'help', 0
    cmd_questionmark db '?', 0
    cmd_exit db 'exit', 0
    ; ================================================================= ;
    cmd_change_prompt db 'change prompt', 0
    msg_help db 'Commands: hi, help, ?, exit, change prompt', 13, 10, 0
    msg_change_prompt db 'Enter new prompt:', 0
    ; ================================================================= ;
    msg_exit db 'Reboot starts now.', 13, 10, 0
    
    buffer times 32 db 0
    
    ; ================
    ; calls start here
    ; ================
    
    print_string:
      lodsb        ; grab a byte from SI
    
      or al, al    ; logical or AL by itself
      jz .done     ; if the result is zero, get out
    
      mov ah, 0x0E
      int 0x10       ; otherwise, print out the character!
    
      jmp print_string
    
    .done:
      ret
    
    get_string:
      xor cl, cl
    
    .loop:
      xor ah, ah    ; mov ah, 0
      int 0x16      ; wait for keypress
    
      cmp al, 8     ; backspace pressed?
      je .backspace ; yes, handle it
    
      cmp al, 13    ; enter pressed?
      je .done      ; yes, we're done
    
      cmp cl, 31    ; 31 chars inputted?
      je .loop      ; yes, only let in backspace and enter
    
      mov ah, 0x0E
      int 0x10      ; print out character
    
      stosb  ; put character in buffer
      inc cl
      jmp .loop
    
    .backspace:
      or cl, cl     ; zero? (start of the string)
      jz .loop      ; if yes, ignore the key
    
      dec di
      mov byte [di], 0  ; delete character
      dec cl        ; decrement counter as well
    
      mov ax, 0x0E08
      int 0x10      ; backspace on the screen
    
      mov al, ' '
      int 0x10      ; blank character out
    
      mov al, 8
      int 0x10      ; backspace again
    
      jmp .loop     ; go to the main loop
    
    .done:
      mov al, 0     ; null terminator
      stosb
    
      mov ax, 0x0E0D
      int 0x10
      mov al, 0x0A
      int 0x10      ; newline
    
      ret
    
    strcmp:
    .loop:
      mov al, [si]   ; fetch a byte from SI
      cmp al, [di]   ; are SI and DI equal?
      jne .done      ; if no, we're done.
    
      or al, al      ; zero?
      jz .done       ; if yes, we're done.
    
      inc di         ; increment DI
      inc si         ; increment SI
      jmp .loop      ; goto .loop
    
    .done:    
      ret
    
      times 510-($-$$) hlt  ; as alternative to db 0
      db 0x55        ; boot signature check (byte 511 in sector 1)
      db 0xAA        ; boot signature check (byte 512 in sector 1)
    

    Hab also ein neues Kommando zu Veränderung des command prompt erstellt. Das funktioniert allerdings nur mit einzelnen Zeichen.

    Gebe ich z.b. '12' ein, wird 'hi' nicht mehr erkannt, ab '12345' wird 'help' nicht mehr erkannt, ab 9 Zeichen '?', ab 12 Zeichen 'exit' und ab 18 Zeichen 'change prompt'.

    Bin nun leider ein absoluter Assembler-Anfänger und ratlos. Wenn jemand der Fehler ins Auge springt, bitte melden.^^

    Danke 🙂



  • Ach vergesst es, ich hatte nur die neue prompt über die im Speicher danach angeordneten strings geschrieben. 😃

    Meine Lösung:

    prompt db '>', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    

    Jetzt kann man prompts in Bufferlänge eingeben.^^

    Edit:

    Wohl noch besser:

    prompt db '>'
    times 31 db 0
    

Anmelden zum Antworten