Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2767
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2610
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2142
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1481
Дата выхода:16.10.2011, 02:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:196 / 61
Вопросов / ответов:1 / 1

Консультация # 184189: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: как сделать программу для 16битного режима процессора х86, которая бы просила от пользователя ввести строку, и выводила ее на экран?В строке можно использовать буквы и цифры. Мне все понятно вроде бы, но требуется сделать это только прерываниями Биос, а не мс-дос. Реально ли такое...


Консультация # 184189:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
как сделать программу для 16битного режима процессора х86, которая бы просила от пользователя ввести строку, и выводила ее на экран?В строке можно использовать буквы и цифры. Мне все понятно вроде бы, но требуется сделать это только прерываниями Биос, а не мс-дос. Реально ли такое? Т.е. без int 21h. И как это сделать, желательно на Масм?

Я пробовал кодить, но у меня что-то не получается, вдобавок не могу обойтись без функций доса + записывается всего 1 клавиша, а мне надо чтоб строка

Код :
org 100h
start:
next_key:
mov ah,10h
int 16h
cmp al,"f"
jz f_pressed
cmp al,"x"
jz x_pressed 
cmp al,"k"
jz k_pressed
jmp next_key

f_pressed:
mov di,offset Mess3
stosb
jmp next_key

x_pressed:
mov di,offset Mess3
stosb
jmp next_key   

k_pressed:
mov dx,offset Mess3
mov ah,9
int 21h
jmp next_key

Mess1 db 'f $'        
Mess2 db 'x $'
Mess3 db ?,$

buff db 9 dup (?)
end start


Суть - программа считывает клавишу, которую ввел пользователь. Если это 'х' или 'f', то с помощью команды stosb пишет содержимое регистра al (в котором код клавиши) туда ,куда указывает di (Т.е. в не объявленную переменную mess3). Если нажать 'k', то она должна выводить переменную mess3 на экран. Но проблема в том, что:
1. вместе с содержимым переменной выводится разный мусор, я так понимаю, это какая-то память.
2. это мс-дос, а мне надо бы биос.
3. в переменную записывается только 1 буква, а не строка

Дата отправки: 11.10.2011, 01:31
Вопрос задал: cherkasoff (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, cherkasoff!
Посмотрите мою программу...
Я даже для выхода из программы не стал явно использовать 21-е прерывание
Удачи в изучении... Если что непонятно, пишите в мини-форум...

Код :
;программа
просит от пользователя ввести строку, 
;и выводит ее на экран. В строке можно использовать буквы и цифры. 
;требуется сделать это только прерываниями Биос, а не мс-дос.

assume cs:CSEG,ds:CSEG
CSEG segment
 org 100h  ;будем делать СОМ-файл
start:    ;точка входа
 lea si, sEnter ;адрес строки 'Enter string:',0
 call Print  ;выведем

 lea di, string ;адрес, куда запишем строку
 call GetString ;введем строку

 lea si, sResult ;адрес строки 0dh,0ah,'Result string:',0
 call Print  ;выведем с новой строки (0dh,0ah)
 lea si, string ;наша строка
 call Print  ;выведем

 lea si, sPress ;адрес строки 0dh,0ah,'Press any key',0
 call Print  ;выведем
 mov ah, 10h  ;подождем нажатия на клавишу,
 int 16h  ; чтобы окно сразу не закрылось 

 ret   ;переход на адрес cs:[0], там находится int 20h

Print proc   ;вывод строки ds:[si] на экран
 mov ah, 0eh  ;функция вывода телетайпом
PrintLoop:
 lodsb   ;очередной символ
 cmp al, 0  ;0 - признак конца строки
 je PrintRet ;на выход
 int 10h  ;БИОС
 jmp PrintLoop ;по всем
PrintRet:
 ret
Print endp

GetString proc  ;ввод строки и запись ее по адресу es:[di]
 mov ah,10h  ;ждем код
 int 16h
 cmp al, 0dh  ;Enter - конец ввода!
 je GetStringRet 
 cmp al, '0'  ;проверим на цифры
 jb GetString
 cmp al, '9'
 jbe SetSymbol
 cmp al, 'A'  ;на большие английские
 jb GetString
 cmp al, 'Z'
 jbe SetSymbol
 cmp al, 'a'  ;на малые английские
 jb GetString
 cmp al, 'z'
 ja GetString ;все остальные игнорируем!
SetSymbol:
 stosb   ;сохраним
 mov ah, 0eh
 int 10h  ;эхо на экран
 jmp GetString ;на повтор
GetStringRet: 
 mov byte ptr [di],0 ;закроем строку нулем
 ret
GetString endp

sEnter db 'Enter string: ',0
sResult db 0dh,0ah,'Result string:',0
sPress db 0dh,0ah,'Press any key',0
string db 9 dup (?) ;буфер для строки

CSEG ends
 end start

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 11.10.2011, 02:29

5
Отличный ответ, везде комментарии, все работает как нужно!
-----
Дата оценки: 11.10.2011, 12:00

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное