всем привет! пишу свой загрузчик, в нем реализовал ввод символов из консоли. работал только с перываниями биоса. когда загрузил на вируталку bochs, то выясснил что символы не вводяться. только смещается курсор и в консоле отладки выводиться keyboard buffer full input ingnored или чето типа этого и в скобочках код символа. вот код загрузчика: Code: ;(c) Белый дым 2012 USE16 ;------------ загрузочный сектор --------------------- org 7C00h EntryPoint: ;--------------здесь проводим инициализацию, устанавливаем сегмент стэка, данных,кода и т.д. mov ax, cs ; ax = сегмент кода cli ; запрещаем прерывания, т.к. у нас еще ничего не настроено mov ss, ax ; зададим сегмент стека какойже как и сегмент кода mov ds, ax ; задаем сигмент данных такойже как и сегмент кода. т.е. всё в одном месте mov es, ax ; mov sp, EntryPoint ; зададим адрес старта программы как вершина стека sti ; разрешаем прерывания т.к. уже можно нормально с ними работать cld ; ставим флаг направления, что бы не было неопределенности ;---------------------------------------------------------------------- mov ax, 3 ; установим режим 80x25 int 10h mov ax, 9000h ; задаем сегмент куда будем считывать данные mov es, ax ; 9000h:0000 mov ah, 2 ; читать сектор mov al, (KernelEnd - KernelStartCode) / 512 ; вычисляем кол-во секторов отведенных под ядро xor dh, dh ; 0 головка mov cx, 2h ; CH = 0 (номер дорожки), CL = 2 (номер сектора) xor bx, bx ; BX = 0 - смещение куда кидать сектор. int 13h ; считаем сектор jc Error ; если ошибка jmp 9000h:0000h ; передаём управление на основной кода Error: mov ax, cs mov es, ax ; восстановим значение текущего сегмента mov dx, 0100h ; X = 0, Y = 1 mov bx, 15 ; белый символ на черном фоне mov ax, 1301h ; AL = 1 (Передвигать курсор), AH = 13h (Вывод строки) mov bp, ErrorMsg ; задаем адрес нашего сообщения mov cx, ErrorMsgEnd - ErrorMsg ; вычисляем длинну строки int 10h ; выводим текст xor ax, ax ; AH = 0 (ожидать нажатие) int 16h ; ждем нажатие клавиши jmp 0FFFFh:0000h ; reboot ;------------ данные загрузочного сектора-------------- BootMsgEnd: ErrorMsg db "Boot failed!", 13, 10, "Press any key to reboot" ErrorMsgEnd: TIMES 510-($-$$) DB 0 ; Заполняем оставшиеся пространство от 500 байт нулями DW 0AA55h ; Сигнатура конца загрузочного сектора. ;------------ ядро --------------------- KernelStart: org 0h KernelStartCode: jmp _Entry ;----вывод символа на текущую позицию puthcar: ;сохраняем регистры push cx push ax push bx ;вывод MOV AH,0AH ;Функция вывода MOV BL,6h ;Атрибут или цвет MOV CX,1 ;Число повторений символа INT 10H ;Вызвать BIOS ;курсор inc dx mov ah,02h int 10h ;восстанавливаем регистры pop bx pop ax pop cx ret ;-----удаление символа backspace: ;сохраняем регистры push cx push ax push bx ;курсор dec dx mov ah,02h int 10h ;вывод MOV AH,0AH ;Функция вывода MOV AL,20h MOV BL,6h ;Атрибут или цвет MOV CX,1 ;Число повторений символа INT 10H ;Вызвать BIOS ;восстанавливаем регистры pop bx pop ax pop cx dec cx;удаляем последний символ jmp lp _Entry: ;ставим атрибуты видеостраницы mov ax,03h int 10h xor cx,cx;обнулим счтчик mov si, _string;задаем адрес сообщения mov dx,0000h;задаем позицию ;вводим текст lp: ;для цикла xor ax,ax;обнулим ax int 16h;читаем символ ;сначала проверим управляющие символы cmp al,0dh;если это enter je ok;заканчиваем ввод и выводим строку cmp al,08h;если это бэкспэйс je backspace;удаляем последний символ из массива и смещаем позицию курсора назад ;если не было управляющих символов - выведем введенный символ call puthcar push si;запомним регистр si, где у нас лежит строка add si,cx;добавляем к адресу счетчик mov byte [si] , al;заносим считанный символ в массив pop si;восстановим обратно inc cx;инкремент счетчика jmp lp;читаем еще ok:;если нажат enter - выводим строку в режиме телетайпа mov dx, 0100h ; X = 0, Y = 1 mov bx, 15 ; белый символ на черном фоне mov ax, 1301h ; AL = 1 (Передвигать курсор), AH = 13h (Вывод строки) mov bp, _string ; задаем адрес нашего сообщения int 10h ; выводим текст exit: ;ждем нажатия клавиши xor ax,ax int 16h _string db 256 dup(0) reboot: xor ax, ax ; AH = 0 (ожидать нажатие) int 16h ; прерывание jmp 0FFFFh:0000h ; делаем программый ребут TIMES 0 - ($-KernelStart) mod 512 DB 0 ; выравниваем размер KernelEnd: на винде в консоле вводиьться норм. из за чего не работает на виртуалке в real mode?
на emu 8086 ничего не происходит вовсе,мне кажется ты где то с выводом накосячил,попробуй заюзать другую функцию вывода. upd попробуй 0Eh
поставил в настройках бочки что клава xt-шная и заработало. правда выводиться всего 5-6 символов и такая херня дальше...