Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2013, 14:35   #1
NataPl
Пользователь
 
Аватар для NataPl
 
Регистрация: 26.02.2013
Сообщений: 38
По умолчанию Ввод данных с клавиатуры

Есть блок кода ассемблера (работает без ОС, из загрузочного сектора).
Код:
;16-битная адресация, пока мы находимся в реальном режиме
use16
org 0x7c00
start:
  jmp 0x0000:entry              ;теперь CS=0, IP=0x7c00
entry:
  mov ax, cs
  mov ds, ax
 
;очистить экран
  mov ax, 0x0003
  int 0x10
 
;открыть A20
  in  al, 0x92
  or  al, 2
  out 0x92, al
 
;Загрузить адрес и размер GDT в GDTR
  lgdt  [gdtr]
;Запретить прерывания
  cli
;Запретить немаскируемые прерывания
  in  al, 0x70
  or  al, 0x80
  out 0x70, al
 
;Переключиться в защищенный режим
  mov  eax, cr0
  or   al, 1
  mov  cr0, eax
 
;Загрузить в CS:EIP точку входа в защищенный режим
  O32 jmp 00001000b:pm_entry
 
;32-битная адресация
use32
;Точка входа в защищенный режим
pm_entry:
;Загрузить сегментные регистры (кроме SS)
  mov  ax, cs
  mov  ds, ax
  mov  es, ax
 
  mov  edi, 0xB8000             ;начало видеопамяти в видеорежиме 0x3
  mov  esi, msg_wlc             ;выводимое сообщение
  cld
.loop                           ;цикл вывода сообщения
  lodsb                         ;считываем очередной символ строки
  test al, al                   ;если встретили 0
  jz   .enter_cmd                    ;прекращаем вывод
  stosb                         ;иначе выводим очередной символ
  mov  al, 7                    ;и его атрибут в видеопамять
  stosb
  jmp  .loop

.enter_cmd


msg_wlc:
  db  'Welcome to NataOS! Enter command:', 0
 
;Глобальная таблица дескрипторов.
;Нулевой дескриптор использовать нельзя!
gdt:
  db  0x00, 0x00, 0x00, 0x00, 0x00,      0x00,      0x00, 0x00 
  db  0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00
gdt_size  equ $ - gdt
 
;данные, загружаемые в регистр GDTR
gdtr:
  dw  gdt_size - 1
  dd  gdt
 
finish:
times 0x1FE-finish+start db 0
db   0x55, 0xAA ; сигнатура загрузочного сектора
Как запросить ввод строки с клавиатуры? (пользователь вводит команду для программы).
NataPl вне форума Ответить с цитированием
Старый 28.08.2013, 17:09   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

В BIOS есть вызов чтения символа с клавиатуры (целой строчки насколько я помню нет) но подозреваю, что в 32битном режиме BIOS работать не будет. Лучше всего читайте строчку до входа в 32бит режим.
Ref: http://www.ctyme.com/intr/int-16.htm

Последний раз редактировалось waleri; 28.08.2013 в 17:11.
waleri вне форума Ответить с цитированием
Старый 28.08.2013, 17:41   #3
NataPl
Пользователь
 
Аватар для NataPl
 
Регистрация: 26.02.2013
Сообщений: 38
По умолчанию

Я не слишком силен в ассемблере, можно маленький пример - считать и вывести введенную клавишу? Нашел в инете пример:
Код:
 
stseg   segment para    stack
        dw      16      dup(?)
stseg   ends
dseg    segment para
 
dseg    ends
cseg    segment para
lab1    proc    far
        assume  cs:cseg,ds:dseg,ss:stseg
        push    ds
        mov     ax,0
        push    ax
        mov     ax,dseg
        mov     ds,ax
        
        mov     ah,05h     ;/Пишем символ 
        mov     cl,'D'        ; в буфер
        mov     ch,00h      ; клавиатуры/
        int     16h             ;
 
        mov     ah,1h     ;/проверяем буфер/
        int     16h
 
        mov     ah,10h     ;/Считываем символ
        int     16h            ; из буфера/
	int 29h
       
        ret
lab1    endp
cseg    ends
        end     lab1
но хз как его интегрировать к себе(
пытаюсь так (в режиме 16 бит), компилиться, но изменений в работе проги нет:
Код:
     section .text
     use16
     org  0x7C00  ; наша программа загружается по адресу 0x7C00
start:
     mov  ax, cs
     mov  ds, ax ; выбираем сегмент данных
 
     mov  si, message
cld ; направление для строковых команд
     mov  ah, 0x0E  ; номер функции BIOS
     mov  bh, 0x00 ; страница видеопамяти
puts_loop:
     lodsb ; загружаем очередной символ в al
     test al, al ; нулевой символ означает конец строки
     jz   puts_loop_exit
     int  0x10 ; вызываем функцию BIOS
     jmp  puts_loop
puts_loop_exit:

    mov     ah,05h     ;/Пишем символ
        mov     cl,'D'        ; в буфер
        mov     ch,00h      ; клавиатуры/
        int     16h             ;
 
        mov     ah,1h     ;/проверяем буфер/
        int     16h
 
        mov     ah,10h     ;/Считываем символ
        int     16h            ; из буфера/
        int 29h
message:
     db   'Hello World!',0
finish:
     times 0x1FE-finish+start db 0
     db   0x55, 0xAA ; сигнатура загрузочного сектора
NataPl вне форума Ответить с цитированием
Старый 29.08.2013, 23:22   #4
NataPl
Пользователь
 
Аватар для NataPl
 
Регистрация: 26.02.2013
Сообщений: 38
По умолчанию

Работаю в защищенном режиме, все еще пытаюсь считывать символы с клавиатуры. Сейчас пытаюсь делать это так:
Код:
.cmd
in al,60h ;чтение из порта клавы
cmp al,17;сравниваем значение с скан кодом кнопки W
je .new_w
cmp al,0 ;если не изменилось, то на повтор
je .cmd
можно ли так, правильно ли составлен код? потому что пока не могу его протестировать... подскажите еще, как вывести на консоль символ который был введен? (его скан код в al храниться).
и посоветуйте плиз литературу или статьи про прерывания процессора в защищенном режиме
NataPl вне форума Ответить с цитированием
Старый 15.09.2013, 12:45   #5
Opterezon
 
Регистрация: 15.09.2013
Сообщений: 8
По умолчанию

Может кому-то пригодится:

Цитата:
mov ebx,2

key_mode:

in al,60h
cmp al,17
je new_w

in al,60h
cmp al,18
je new_z

cli
Jmp key_mode


print_f:
mov edi, 0xB8000 ;начало видеопамяти в видеорежиме 0x3
add edi,ebx
mov esi, eax ;выводимое сообщение
cld
looph: ;цикл вывода сообщения
lodsb ;считываем очередной символ строки
test al, al ;если встретили 0
jz enddd_d ;прекращаем вывод
stosb ;иначе выводим очередной символ
mov al, 7 ;и его атрибут в видеопамять
stosb
jmp looph


new_w:
lea eax,[w_keyy]
add ebx,2
jmp new_w_w

new_w_w:
in al,60h
cmp al,17
je new_w_w
jmp print_f


new_z:
lea eax,[z_keyy]
add ebx,2
jmp new_w_w

new_z_z:
in al,60h
cmp al,18
je new_z_z
jmp print_f



enddd_d:
jmp key_mode


w_keyy db 'w',0
z_keyy db 'z',0

Код наверняка с ошибками, т.к не тестировал и писал по памяти большую часть. Как это работает. Входим в цикл ожидания нажатия. Если захватили клавишу - сдвигаем позицию символа и в eax записываем то, что нужно вывести. Сам алгоритм не оптимален, но работает. Кстати, для таких функций, как "удаление символа" нужно лишь немного импровизации. Почти тоже самое, только вместо символа - пробел, а вместо add ebx,2 - sub ebx,2.
Opterezon вне форума Ответить с цитированием
Старый 16.09.2013, 00:49   #6
maxillion
 
Регистрация: 12.05.2010
Сообщений: 6
По умолчанию

ну во первых после переключения в PM прерывания BIOS больше не доступны
во вторых в PM нужно еще таблицу прерываний создать
Вот патом только можно будит считывать данные с клавиатуры
maxillion вне форума Ответить с цитированием
Старый 16.09.2013, 15:05   #7
Opterezon
 
Регистрация: 15.09.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от maxillion Посмотреть сообщение
ну во первых после переключения в PM прерывания BIOS больше не доступны
во вторых в PM нужно еще таблицу прерываний создать
Вот патом только можно будит считывать данные с клавиатуры
Бред. 60H работает в обоих режимах, только при цикле ожидания нужно отключать прерывания. Лично тестировал.
Opterezon вне форума Ответить с цитированием
Старый 16.09.2013, 15:14   #8
Opterezon
 
Регистрация: 15.09.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от maxillion Посмотреть сообщение
ну во первых после переключения в PM прерывания BIOS больше не доступны
Где ты тут их увидел?
Opterezon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод/вывод данных с клавиатуры в opengl flaps Visual C++ 0 24.05.2011 21:07
List Control. Ввод данных с клавиатуры juky88 Общие вопросы C/C++ 1 01.05.2011 18:51
Ввод данных с клавиатуры (Eclipse) k0tone Помощь студентам 0 28.01.2011 21:38
ввод данных с клавиатуры juden Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.05.2008 18:05