Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40

Запрос ввода строки с клавиатуры

28.08.2013, 14:38. Показов 5553. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть блок кода ассемблера (работает без ОС, из загрузочного сектора).
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
;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 ; сигнатура загрузочного сектора
Как запросить ввод строки с клавиатуры? (пользователь вводит команду для программы).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2013, 14:38
Ответы с готовыми решениями:

Составить программу для ввода строки символов с клавиатуры в буфер и вывод этой строки на экран
Составить программу для ввода строки символов с клавиатуры в буфер и вывод этой строки на экран Как это хоть приблизительно сделать???

Ввести с клавиатуры строку символов.Признак окончания ввода строки - нажатие клавиши 'ввод'.Программа должна определить длину введенной строки L
Помогите пожалуйста:gbye: Ввести с клавиатуры строку символов.Признак окончания ввода строки - нажатие клавиши 'ввод'.Программа должна...

Ввода строки в массив строк с клавиатуры
Доброго времени суток! помогите решить проблему! Хочу написать метод в классе для ввода строки в массив строк с клавиатуры, выдает...

24
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.08.2013, 16:00
мне тоже интересно

на сколько помню, нужно перехватить прерывание клавиатуры. вроде у клавиши "f12" скан-код "0xD8"
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
28.08.2013, 17:28  [ТС]
Нашел пример:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
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
но не знаю как его в мой код всунуть...пытаюсь делать так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
;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
mov ah,05h     ;/Пишем символ
mov     cl,'D'        ; в буфер
mov     ch,00h      ; клавиатуры/
int     16h             ;
 
mov     ah,1h     ;/проверяем буфер/
int     16h
 
mov     ah,10h     ;/Считываем символ
int     16h            ; из буфера/
int 29h
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 ; сигнатура загрузочного сектора
.data
buf db 5
компилит нормально, но изменений в работе проги нету
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
28.08.2013, 18:52
Цитата Сообщение от NataPl Посмотреть сообщение
int * * 16h
Это вызов для реального режима.
В защищенном нужно создать таблицу дескрипторов прерываний защищенного режима,настроить IDTR (Interrupt Descriptor Table Register), разблокировать прерывания.
Читать об IDT здесь: http://subscribe.ru/catalog/comp.soft.prog.intelpm

А вообще, в защищенном режиме единственный способ работать с клавой - перехватывать Int 9h, считывать сканкод из порта 60h и анализировать.
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
28.08.2013, 19:02  [ТС]
А если работать в реальном режиме, то как с клавой работать?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.08.2013, 19:12
Цитата Сообщение от NataPl Посмотреть сообщение
А если работать в реальном режиме, то как с клавой работать?
самое простое - через биос. там эти прерывания должны работать.

а можно поинтересоваться, на сколько серьезен этот проект? если не баловство на пару месяцев, то могу предложить взаимопомощь
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
28.08.2013, 20:00  [ТС]
Проект серьезен, сейчас учусь работать в ассемблере без ОС (про функции БИОС кстать читал уже, ща пытаюсь делать). Про то что учусь я говорю к тому что мало что знаю, парень я далеко не глупый, просто все время самоучка, спросить не у кого, пытаюсь разбираться сам, так что у меня сейчас стараний много, а результаты двигаються медленно.
План развития такой - написать небольшую ОС на Ассемблере и Си (текстовой режим, небольшое подобие графического интерфейса, презентационная версия короч), потом презентовать ее на конференции программеров (в Киеве живу, такие конференции часто проходят). Во время презентации попытаться найти людей в команду разработки. Ну и по немногу разрабатывать, а там посмотрим - можно позиционировать как ОС для узких задач, для встроенных систем или просто пользовательскую ОС (ну это уже очень много людей и времени над). В любом случае это большой опыт в низкоуровневом программировании. Ну эт планы обобщенные, если интерестно могу точнее в личку написать. Кстати, про серьезность проекта, мой прошлый проект я довел до релиза, и отзывы положительные (гугли Nata Player).
По теме БИОС - я ту справку нашел? http://www.ctyme.com/intr/int-16.htm
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.08.2013, 20:32
NataPl, да, мне будет интересно.

Что касается плана развития. Не рекомендую писать ОС в реальном режиме. Ограничение в на ОЗУ в 1 мегабайт, сегмент на 64 кб и возможности процессора урезаны до исторического 8086 (если не ошибаюсь). А тем более, если там будет код на языке Си, то тормоза неизбежны. Еще один минус реального режима, как стоит отметить, это чувствительность к сбоям, т.е при ошибке в прикладном приложении может вылететь сама ОС.

Справка вроде как та, но в будущем все равно придется столкнуться с таблицами дескрипторов и прочим садомазохизмом.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
28.08.2013, 21:29
Цитата Сообщение от NataPl Посмотреть сообщение
я ту справку нашел?
Да, это Ральф. Есть версия в .chm
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
28.08.2013, 22:37  [ТС]
а что посоветуете почитать про работу с клавиатурой из защищенного режима?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
28.08.2013, 23:10
Дык, варианта два - вываливаться в риалмоду и работать через биос или слепить свой обработчик в протмоде.
Protected mode BIOS calls
Award Bios source code - отсюда можно выдрать исходники обработчика int9.
Sanos Operating System Kernel - с исходниками на си/асме.
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
29.08.2013, 09:20  [ТС]
Ок, подскажите, а как подгрузить в память и передать управление на второй бинарник? Вроде команда int 13h но не могу понять как указать адрес ко второму бинарнику, для подгрузки его в память.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
29.08.2013, 11:16
Почитайте этот флейм - здравые мысли(не от ТСа) там есть.
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
29.08.2013, 23:23  [ТС]
Работаю в защищенном режиме, все еще пытаюсь считывать символы с клавиатуры. Сейчас пытаюсь делать это так:
Assembler
1
2
3
4
5
6
.cmd
in al,60h ;чтение из порта клавы
cmp al,17;сравниваем значение с скан кодом кнопки W
je .new_w
cmp al,0 ;если не изменилось, то на повтор
je .cmd
можно ли так, правильно ли составлен код? потому что пока не могу его протестировать... подскажите еще, как вывести на консоль символ который был введен? (его скан код в al храниться).
и посоветуйте плиз литературу или статьи про прерывания процессора в защищенном режиме
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
30.08.2013, 02:56
Цитата Сообщение от NataPl Посмотреть сообщение
и посоветуйте плиз литературу или статьи про прерывания процессора в защищенном режиме
  • книга Фроловых "Защищенный режим процессоров Intel 80286/80386/80486" Том 4, М.: Диалог-МИФИ
  • Зубков С.В. "Assembler для Windows, DOS и Unix"
  • К.Г.Финогенов "Использование языка ассемблера"
  • П.И.Рудаков К.Г.Финогенов "Язык ассемблера: уроки программирования"
  • Юров Хорошенко "Assembler: учебный курс"
  • стати Broken Sword'a
1
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
30.08.2013, 09:10
Руслан Аблязов. там есть готовый код работы с клавиатурой в PM
1
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
30.08.2013, 09:44  [ТС]
спасибо большое

Добавлено через 15 минут
А подскажите еще, как в защищенной режиме перевести текст на новую строку? в реальном режиме делал с помощью кода
Assembler
1
10,13
но в защищенном эт не работает
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
30.08.2013, 10:05
NataPl,
а какой видеорежим установлен?
0
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 40
30.08.2013, 10:29  [ТС]
0x3
устанавливаю так:
Assembler
1
mov  edi, 0xB8000
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
30.08.2013, 10:33
NataPl,
80 символов в строке, реально - четные символы, нечетные атрибуты, di + 160 - 2*(длина строки) и произойдет перевод на следующую строку без символов 0хА и 0хD
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2013, 10:33
Помогаю со студенческими работами здесь

Какую функцию ввода строки с клавиатуры использовать?
Использую VS Express 2013. Очень начинающий. Столкнулся с проблемой - как ввести строку с клавиатуры. В самоучителе приведен...

Строки:После ввода с клавиатуры строками некоторых фамилий
После ввода с клавиатуры строками некоторых фамилий и рядом с ними возраста (год рождения) отсортировать и выдать на экран этот список, но...

Теряется запрос ввода строки, содержащийся в функции класса
Здраствуйте! Имею следующую проблему : завожу класс "Личности", в нем описываю различные характеристики личностей ( ФИО, город, телефон и...

После ввода с клавиатуры произвольного строки определить и вывести на экран количество латинских букв в нем
После ввода с клавиатуры произвольной строки определить и вывести на экран количество латинских букв в нем.

После ввода с клавиатуры произвольного строки определить и вывести на экран строку символов только с четными н
После ввода с клавиатуры произвольного строки определить и вывести на экран строку символов только с четными номерами кодов ASCII,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru