Сборка ОС, которая может получить Keypress и распечатать его - PullRequest
0 голосов
/ 28 апреля 2018

По сути, я работаю над созданием простой консольной ОС, которая по функциональности похожа на MS-DOS. Я понимаю, что такой проект не может быть легко поддержан, и мне все равно;). Итак, вот что я сделал до сих пор:

   ;------------------------------------------------------
   ;|                 SMOS Shell Source                  |
   ;|          Kept under GPLv3 Open Source license      |
   ;|         (https://www.gnu.org/licenses/gpl.txt)     |
   ;------------------------------------------------------

BITS 16

start:
     mov ax, 07C0h
     add ax, 288
     mov ss, ax
     mov sp, 4096

     mov ax, 07C0h
     mov ds, ax
     jmp kool

kool:
    mov si, lineone
    call print_string
    mov si, linetwo
    call print_string
    mov si, linethree
    call print_string
    call newline
    mov si, shellprompt
    call print_string
    jmp type

shell:
    call newline
    mov si, shellprompt
    call print_string
    jmp type

    lineone db '----------------------',13,10,0
    linetwo db '|   WELCOME TO SMOS  |',13,10,0
    linethree db '----------------------',13,10,0
    shellprompt db 'smos> ',0
    break db 13,10,0



clearscreen:
    mov ah, 0x06
    mov al, 0
    int 10h
type:
    mov ah,0h
    int 16h
    jmp shell
print_string:
    mov ah, 0Eh

.repeat:
    lodsb
    cmp al, 0
    je done 
    int 10h 
    jmp .repeat
newline:
    mov si, break
    call print_string

done:
    ret


    times 510-($-$$) db 0
    dw 0xAA55

То, что я хотел бы, - это способ получить нажатие клавиши и распечатать его на smos> строке оболочки. Таким образом, если пользователь наберет test, то отобразится smos> test, и если пользователь нажмет клавишу ввода, он сможет быть сохранен и затем обработан. Я искал что-то похожее на мой вопрос, и вы можете видеть, что в функции type: он останавливает процесс, пока не будет нажата клавиша, что является попыткой, которую я нашел. Тем не менее, я не могу понять, как продолжить код, чтобы получить результат, который я объяснил. В любом случае, помните, когда вы отвечаете, что я новичок в сборке, так что относитесь ко мне, как к пятилетнему ребенку, когда объясняете. Заранее спасибо!

1 Ответ

0 голосов
/ 28 апреля 2018

Ваш вопрос слишком широкий, чтобы на него можно было ответить, но я могу решить проблему, с которой вы, похоже, столкнулись в данный момент:

В этом проблема, я не знаю, как сохранить его для регистрации. Я хотел бы иметь возможность сохранить его как myvar db, al, 0. al является нажатием клавиши, хранящейся в int 16h. - DecstarG 4 часа назад

Хитрость заключается в том, чтобы сохранить нажатия клавиш в памяти.
Сначала вам нужно зарезервировать блок памяти, для этого вы можете использовать стек (см .: Что такое фрейм стека в сборке? ) или использовать менеджер памяти (см. Здесь: https://github.com/jakubbogucki/memoryManager), Или просто используйте фиксированный буфер в памяти (см .: 3.2.2 RESB и Friends: Объявление неинициализированных данных) , который используется только для этого.

Внимательно следите за переполнением буфера , Вы должны выполнить проверку, чтобы убедиться, что вы не читаете и не пишете после конца буфера.

Хранить вещи в памяти просто:

keybuffer: resb 1024
endofbuffer: resb 1

mov si,keybuffer         ;get the keybuffer address
loop:
....                     ;get the keystroke somehow.
mov [si],al              ;Store the keystroke (assuming it's in AL             
inc si                   ;Go to the next space in the buffer
mov di,endofbuffer       ;Is the buffer full?
cmp di,si                ;
je BufferIsFull          ;yes, jump to the code to handle this.
jmp loop                 ;we're still good, keep reading keys.

Если вы хотите взглянуть на чужую попытку написания ОС с нуля, посмотрите: http://mikeos.sourceforge.net/write-your-own-os.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...