Вопрос № 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