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

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


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 575
от 17.10.2006, 03:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 352, Экспертов: 34
В номере:Вопросов: 1, Ответов: 2


Вопрос № 58510: Уважаемые эксперты, подскажите пожалуйсто ответ на глупейший вопрос. Как сделать так чтобы программа после вывода результатов ожидала нажатие на ENTER. Почему то прерывание int 16h с ф-ей 10h не работает. вот код программы: include userv.mac ...

Вопрос № 58.510
Уважаемые эксперты, подскажите пожалуйсто ответ на глупейший вопрос. Как сделать так чтобы программа после вывода результатов ожидала нажатие на ENTER. Почему то прерывание int 16h с ф-ей 10h не работает. вот код программы:
include userv.mac
main segment
x dw 7 dup(0)
y dw 7 dup(0)
S dw 0
a dw 0
b dw 0
;Íà÷àëî ãëàâíîé ïðîãðàììû
begin:
mov bx,0
_Vx:
; Ââîä X
u_key_bin <13,10,'Vvedite Xi: '>
mov x[bx],ax
add bx,2
cmp bx,14
je _endVx
jmp _Vx
_endVx:
;Ââîä îñòàëüíûõ ïàðàìåòðîâ (à, b)
u_key_bin <13,10,'Vvedite a: '>
mov a,ax
u_key_bin <13,10,'Vvedite b: '>
mov b,ax
;Äàëåå èäåò öûêë ñ óñëîâèåì ïðîâåðêè
;çíà÷åíèé Õ, ïîëó÷åíèÿ çíà÷åíèÿ Ó
mov bx,0
Cikle:
cmp x[bx],1
ja bolshe
mov ax,a
imul x[bx]
imul x[bx]
sub ax,b
mov y[bx],ax
jmp end_if
bolshe:
mov ax,a
mov dx,0
idiv x[bx]
mov y[bx],ax
mov ax,x[bx]
imul x[bx]
add y[bx],ax
end_if:
add bx,2
cmp bx,14
je exit
jmp Cikle
exit:
;Ññóìèðîâàíèå ýëåìåíòîâ
mov bx,0
sum_cikle:
mov ax,y[bx]
add s,ax
add bx,2
cmp bx,14
je end_sum_cikle
jmp sum_cikle
end_sum_cikle:
mov ax,s
u_show_bin <13,10,'SUMMA = '>
exit_main:
main ends
stack segment stack
dw 64 dup(0)
stack ends
end begin

Отправлен: 11.10.2006, 13:07
Вопрос задал: Глеб (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sergijj
Здравствуйте, Глеб!

Простите, но что-то я не увидел в Вашей программе вызова int16h (хотел посмотреть Вашу реализацию обработки результата), поэтому объясняю с начала:

1. Int 16h - НЕ ждёт нажатия клавиши, а только выдаёт слово скан-кода если оно есть в очереди буфера клавиатуры, т.е. если буфер не пуст - выдаёт первое слово из него.
2. Для того чтобы реализовать задержку, необходимо сначала проверить есть ли что-нибудь в буфере клавиатуры, для чего вызвать int 16h 01h.
3. Если на выходе нуль, тогда возвратиться на п.1
4. Если на выходе НЕ нуль - обработать его на предмет принадлежности к коду 13 (<Enter>).

Всё это делается например так:
(Код на C с инлайновой ассемблерной вставкой - в приложении.
В конце там идёт ещё и очищение буфера клавиатуры за собой.)
Кстати (по поводу особенности int 16h) для <Enter> в этом случае возвращённое слово будет равно 0x1C0D (1C0Dh) = scan_code + ascii_code.

Также реализовать остановку до нажатия клавиши можно так:
unsigned char readkey(void){
asm{
mov ah,07h
int 21h
}
return(_AL);
};//of read key

(Не забудьте после вызова проверить код на принадлежность к <Enter> - должен быть = 0Dh)

И ещё: просто проверить была ли нажата какая-нибудь клавиша (а если нажата, то обработать её) можно так:

in al,060h

(это - проверка скан-кода начала буфера клавиатуры), в этом случае если в AL окажется число,большее или равное количеству_клавиш_на_клавиатуре_(по_умолчанию_=_101_или_103), то буфер - пуст. Если же в AL окажется число 1Ch, значит был нажат <Enter>...;)

Успехов!

Приложение:

---------
Стучитесь! И Вас откопают...

Ответ отправил: Sergijj (статус: 6-ой класс)
Ответ отправлен: 11.10.2006, 14:01

Отвечает: ENS
Здравствуйте, Глеб!
ENTER можно обрабатывать той же функцией - 10h прерывания int 16h - ЗАДЕРЖКА ДО НАЖАТИЯ КЛАВИШИ
просто сравнивать AL с ENTERом(0Dh).
get_key: ; метка начала ожидани я клавиши
mov ah,10h
int 16h ; получаем кей
cmp al,0Dh;Энтер ли это ???
je ok_enter;да- прыгаем на метку обрабокки ентера
jmp get_key;нет- ждем дальше

---------
Если нет выхода ищу вход.
Ответ отправил: ENS (статус: 6-ой класс)
Ответ отправлен: 11.10.2006, 20:04


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное