не выводяться символы на экран

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Белый Дым, 28 Feb 2012.

  1. Белый Дым

    Белый Дым New Member

    Joined:
    25 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    всем привет! пишу свой загрузчик, в нем реализовал ввод символов из консоли. работал только с перываниями биоса. когда загрузил на вируталку 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?
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    загрузчик то слешика:):)
     
  3. Белый Дым

    Белый Дым New Member

    Joined:
    25 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    да, он за основу взят. я ядро свое запилил а загрузчик его оставил
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    на emu 8086 ничего не происходит вовсе,мне кажется ты где то с выводом накосячил,попробуй заюзать другую функцию вывода.
    upd попробуй 0Eh
     
    #4 DooD, 28 Feb 2012
    Last edited: 28 Feb 2012
  5. Белый Дым

    Белый Дым New Member

    Joined:
    25 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    поставил в настройках бочки что клава xt-шная и заработало. правда выводиться всего 5-6 символов и такая херня дальше...