Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выход из программы по нажатию клавиши

30K
09 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
Есть программа - таймер. Смысл работы программы заключаеться в том, чтобы подменить прерывание 08h своим, и, декрементируя в своем прерывании ранее сохраненные такты, реализовать таймер. После отработки своего обработчика прерывания, возвращаю исходный вектор прерывания, и пытаюсь выполнить инструкцию:
mov ah,08h
int 21h

Чтобы программа не закрывалась сама, а ждала нажатия ... Почему то не работает :( пробовал 16 прерывание, тоже не работает ... Может взглянете? Я конечно понимаю, что никому не хочеться заниматься дебагом чужого корявого неумелого кода ... но я в отчаянии, скоро сдавать ... Курсовик все же ....
261
09 декабря 2007 года
ahilles
1.5K / / 03.11.2005
вот пример программы под Windows, которая выводит сообщения через определённый промежуток времени.

FASM
Код:
format PE GUI 4.0
entry start

include 'win32a.inc'

section '.code' code readable writeable executable

mess db 'Message',0
caption db 'Caption',0

counter dd 3 ;количество повторений
delay_time equ 3000;время задержки в миллисекундах

msg MSG
TI dd 0

proc TimerProc, _HWND,uMsg, idEvent, dwTime    

    pushad

    invoke MessageBox, 0,caption ,mess ,0
   
    mov [TI], eax

    dec dword [counter]
    jnz @f

    invoke KillTimer, 0, [TI]

    invoke ExitProcess,0

   @@:
    popad
    ret    
endp

start:
      invoke SetTimer,0,0,delay_time, TimerProc
      mov [TI], eax

     msg_loop:
      invoke  GetMessage,msg,NULL,0,0
      cmp     eax,1
      jb      end_loop
      jne     msg_loop
      invoke  TranslateMessage,msg
      invoke  DispatchMessage,msg
      jmp     msg_loop
     end_loop:


section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import kernel,\
         ExitProcess,'ExitProcess'

  import user,\
         MessageBox,'MessageBoxA',\
         SetTimer, 'SetTimer',\
         GetMessage,'GetMessageA',\
         TranslateMessage,'TranslateMessage',\
         DispatchMessage,'DispatchMessageA',\
         KillTimer,'KillTimer'

P.S. прогресс РУЛИТ!!! Windows (или Linux) рулит!!!
30K
09 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
мне надо именно под tiny модель, без всяких прогрессов ... не о том речь, как написать, проблемма в том что инт не работает :(
1.6K
09 декабря 2007 года
Vov4ick
476 / / 01.02.2007
Т.к. программа не резидентная, советую не перехватывать прерывания, а просто в цикле проверять системное время и сравнивать с заданным. Будет гораздо проще. Попутно можно организовать его вывод на экран.
ЗЫ первые три строчки после метки main - лишние. Тогда можно будет компоновать в ком-файл, который тебе и нужен.
Также в сверхмалой модели недопустимо располагать код ДО точки входа в программу, поэтому процедуры нужно перенести в конец, что, впрочем, никак не повлияет на функциональность
30K
09 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
Спасибо, я это учту конечно ... а что с выходом делать?
274
10 декабря 2007 года
Lone Wolf
1.3K / / 26.11.2006
Сперва исправь все. Я вобще не представляю как у тебя оно работает.
в tiny модели есть только один сегмент - сегмент кода, по этому убери сегмент данных и все данные перенеси в конец. Туда же можно пренести и процедуры, так что-бы было:
 
Код:
model tiny
    .code
     org 100h
main:
............дальше по коду....
end main
30K
10 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
Поправил, перед тем как возвращать на место вектор прерывания, делаю
mov ah,08h int 21 или xor ax,ax int 16h

Бесолезно ... выкидывает ошибку, либо не работает ... пробовал и после этих строк, и перед - навкакую ... :( Вот исправил то что ты написал ....
274
10 декабря 2007 года
Lone Wolf
1.3K / / 26.11.2006
1. Лучше перехватывать 1с а не 08, оно специально сохдавалось для пользовательских приложений.
2. Поубирай ворнингы, ты переменныую обозвал CH
3. убери
 
Код:
mov ax,@data
mov ds,ax

оно тебе не нужно, ыт ж ком программу делаеш. tlink /t name
4. а как ты из обработчика прерывания выпрыгуеш в основное тело программы?
30K
10 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
jnc outt
jmp finalprog

Вот выход в осн тело ...
Убрал, переменную переименовал .... ( чтож с интом то не так ... через 1С никак ... по ТЗ надо через 08 ... ((

А и еще такой вопрос ... как отловить ESC + Ctrl или Shift например? а то у меня в обработчике сделано по Shift + ~ ...

А если мне надо exe то это оставить?
274
11 декабря 2007 года
Lone Wolf
1.3K / / 26.11.2006
ты же писалл тебе нужна tiny - модель.... а эта модель свойтсвенна com прграммам ,а не exe
насчет инта, прост осуществую определненные правила, и перехватывать 08 - вобщем-то нежелательно. Для этого создавалось, так называемое пользовательское перывания от таймера. т.е. 1с оно вызывается обработчиком 8го, так что работать будет также.(у тебя в ТЗ написанно именно 08 или перывания таймера?)
насчт ctrl и alt читай флаги клавиатуры адресс 0040:0017 или используй вторую функци. 16го прерывания

а насчет ожидания
 
Код:
...
_wait:
   mov ah,01
   int 16h
   jnz  _wait
exit:
..

так пытался?
30K
11 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
Пробовал ... при выполнении тупо игнорирует .. даже пытался в процедуру это запихать и call-ом где надо вызывать ... :(

ммм... т.е. если я поменяю 08 на 1С в принципе, ничего не должно поменяться?
274
11 декабря 2007 года
Lone Wolf
1.3K / / 26.11.2006
теоретически, не должно. только убери из обработчика отсылку контролеру сигнала о завершении обработки апаратного прерывания.
30K
11 декабря 2007 года
FireFly[53]
16 / / 19.11.2007
хорошо ...
может ты бы попробовал покомпилировать \ позапускать ? а то мне с "выходом по нажатию" чтото тускло ... не работает окаянный, хоть ты тресни :(


А и еще ... чем отличаеться exe от com и модели tiny от small ?
34K
24 декабря 2007 года
elron
2 / / 29.11.2007
у самого курсавик "секундомер"..
вот в помощь:
Код:
loop1:
...
    mov ah,1    ; проверка состояния клавиатуры
    int 16h ; если не нажал
    jz  loop1   ; то повторяем
    xor ah,ah   ; если все же нажал..
    int 16h ;
    cmp ah,01h  ; и если нажал ESC,
    je  exit    ; то выход
    cmp ah,39h  ; и если нажал пробел,
    je  halt    ; то останавливаем
    call    loop1
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог