Простой загрузчик [реальный режим - 16 бит, nasm] - пытается прочитать некоторые нажатия клавиш и вывести их на экран - PullRequest
0 голосов
/ 17 апреля 2020

Недавно я начал больше интересоваться загрузчиками, я пытался написать свой собственный, и что-то пошло не так, с комбинацией печати и чтения. кажется, что я перезаписываю следующую переменную, затем я больше не могу печатать.

org 0x7c00 ; starting address

mov si, msg
call print_string ; here's it printing fine

mov si, save
call read_string ; here's everything going fine
mov si, save
call print_string ; but here's something somehow broken
mov si, msg
call print_string ; and now it's not printing the second message (I guess I'm overwriting the "0x00" byte) 

jmp $ ; infinate loop

print_string:
    pusha
    print_char:
        mov ah, 0x0e
        mov al, [si] ; pass one byte as an argument
        int 0x10 ; print to the screen
        inc si ; inc si to point to the next byte
        cmp al, 0x00 ; compare with 0
        jne print_char  
    popa
    ret

read_string:
    pusha
    read_char:
        mov ah, 0x00
        int 0x16 ; read keystroke
        mov BYTE [si], al ; store into the passed argument(for future use)
        mov ah, 0x0e
        int 0x10 ; print the char(while typing)
        inc si ; point to the next byte
        cmp al, 0x0d ; check if 'enter' has pressed 
        jne read_char
    mov BYTE [si], 0x0a
    inc si ; point to the next byte
    mov BYTE [si], 0x0d ; new line
    inc si ; point to the next byte
    mov BYTE [si], 0x00 ; last byte
    popa
    ret

save: db "" 
msg: db "input:", 0x00
times 510 - ($ - $$) db 0 ; padding
dw 0xaa55 ; magic

Вводимый мной ввод (перед чтением, представьте, что я нажимаю там "lol"):

input:_

, а затем (после прочтения):

lolput: lol
 lol
 _

Я был бы очень признателен, если бы кто-то мог мне помочь, я искал около rnet около 3 дней, но тоже ничего полезно было найти. Дайте мне знать, если у вас есть хорошие ресурсы или книги, или какие-либо другие предложения. Надеюсь, я прояснил проблему достаточно.

...