Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий