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'
Выход из программы по нажатию клавиши
mov ah,08h
int 21h
Чтобы программа не закрывалась сама, а ждала нажатия ... Почему то не работает :( пробовал 16 прерывание, тоже не работает ... Может взглянете? Я конечно понимаю, что никому не хочеться заниматься дебагом чужого корявого неумелого кода ... но я в отчаянии, скоро сдавать ... Курсовик все же ....
вот пример программы под Windows, которая выводит сообщения через определённый промежуток времени.
мне надо именно под tiny модель, без всяких прогрессов ... не о том речь, как написать, проблемма в том что инт не работает :(
ЗЫ первые три строчки после метки main - лишние. Тогда можно будет компоновать в ком-файл, который тебе и нужен.
Также в сверхмалой модели недопустимо располагать код ДО точки входа в программу, поэтому процедуры нужно перенести в конец, что, впрочем, никак не повлияет на функциональность
Спасибо, я это учту конечно ... а что с выходом делать?
в tiny модели есть только один сегмент - сегмент кода, по этому убери сегмент данных и все данные перенеси в конец. Туда же можно пренести и процедуры, так что-бы было:
Код:
model tiny
.code
org 100h
main:
............дальше по коду....
end main
.code
org 100h
main:
............дальше по коду....
end main
mov ah,08h int 21 или xor ax,ax int 16h
Бесолезно ... выкидывает ошибку, либо не работает ... пробовал и после этих строк, и перед - навкакую ... :( Вот исправил то что ты написал ....
2. Поубирай ворнингы, ты переменныую обозвал CH
3. убери
Код:
mov ax,@data
mov ds,ax
mov ds,ax
оно тебе не нужно, ыт ж ком программу делаеш. tlink /t name
4. а как ты из обработчика прерывания выпрыгуеш в основное тело программы?
jmp finalprog
Вот выход в осн тело ...
Убрал, переменную переименовал .... ( чтож с интом то не так ... через 1С никак ... по ТЗ надо через 08 ... ((
А и еще такой вопрос ... как отловить ESC + Ctrl или Shift например? а то у меня в обработчике сделано по Shift + ~ ...
А если мне надо exe то это оставить?
насчет инта, прост осуществую определненные правила, и перехватывать 08 - вобщем-то нежелательно. Для этого создавалось, так называемое пользовательское перывания от таймера. т.е. 1с оно вызывается обработчиком 8го, так что работать будет также.(у тебя в ТЗ написанно именно 08 или перывания таймера?)
насчт ctrl и alt читай флаги клавиатуры адресс 0040:0017 или используй вторую функци. 16го прерывания
а насчет ожидания
Код:
...
_wait:
mov ah,01
int 16h
jnz _wait
exit:
..
_wait:
mov ah,01
int 16h
jnz _wait
exit:
..
так пытался?
ммм... т.е. если я поменяю 08 на 1С в принципе, ничего не должно поменяться?
теоретически, не должно. только убери из обработчика отсылку контролеру сигнала о завершении обработки апаратного прерывания.
может ты бы попробовал покомпилировать \ позапускать ? а то мне с "выходом по нажатию" чтото тускло ... не работает окаянный, хоть ты тресни :(
А и еще ... чем отличаеться exe от com и модели tiny от small ?
вот в помощь:
Код:
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
...
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