Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2011, 20:48   #1
DarkLogic
 
Регистрация: 05.12.2010
Сообщений: 5
По умолчанию tasm32 не выполняет событие после сравнения строк функцией апи

консольное приложение, не выполняет событие пищалки, оно должно сработать когда реальное время совпадет с введенным, время плохо обнавляется из-за моей проблемы с проверкой на входное устройство он его ждет пока не нажмется клавиша или не двинется мышь только потом обновляет время, ввод времени для пищалки через таб.

1.В чем проблема при сравнении строк, почему в еах (строка 66) не заностися ноль, может строки не совпадают из-за того что в одной нет нуля в конце?
2.Как можно улучшить код, чтобы время обновлялось не дожидаясь нажатия клавиши или движения мыши?
p.s. если убрать проверку на клавиатуру с 39-41 строку, то время обновляется нормально.

includelib import32.lib
extrn ExitProcess:near
extrn WriteConsoleA:near
extrn ReadConsoleA:near
extrn ReadConsoleInputA:near
extrn GetStdHandle:near
extrn Beep:near
extrn Sleep:near
extrn SetConsoleTextAttribute:near
extrn SetConsoleCursorPosition:near
extrn MessageBoxA:near
extrn GetTimeFormatA:near
extrn lstrcmp:near
.386
.model flat,stdcall
.data
Coord struc
x word (?)
y word (?)
Coord ends
Crd Coord ?
timebuff db '00:00:00',0
timerbuff db '00:00:00',0
message db 'Welcome!',0
ns dd ?
buffer dd 256 dup (?)
tit db '----',0
mes db 'mess',0
m dd ?
hin dd ?
hout dd ?
.code
start:
call GetStdHandle,-10
mov hin,eax
call GetStdHandle,-11
mov hout,eax
read_:
call ReadConsoleInputA,hin,offset buffer,1,offset ns,0
cmp word ptr buffer,1h
jne time_
escape_:
cmp byte ptr buffer+14,27
jne endescape_
cmp byte ptr buffer+4,0
jz endescape_
jmp esc_
endescape_:
writemessage_:
cmp byte ptr buffer+14,8
jne endwritemessage_
cmp byte ptr buffer+4,0
jz endwritemessage_
call MessageBoxA,0,offset mes,offset tit,0
endwritemessage_:
enter_:
cmp byte ptr buffer+14,9
jne endenter_
cmp byte ptr buffer+4,0
jz endenter_
mov Crd.y,1
mov Crd.x,0
call SetConsoleCursorPosition,hout,Crd
call ReadConsoleA,hin,offset timerbuff,8,offset ns,0
endenter_:
call lstrcmp,offset timebuff,offset timerbuff
cmp eax,0
jne read_
call Beep,1000,800
jmp read_
time_:
call GetTimeFormatA,0,8h,0,0,offset timebuff,9
mov Crd.y,0
mov Crd.x,0
call SetConsoleCursorPosition,hout,Crd
call WriteConsoleA,hout,offset timebuff,8,offset ns,0
call Sleep,501
jmp read_
esc_:
call Beep,1000,100
call ExitProcess,0
end start
DarkLogic вне форума Ответить с цитированием
Старый 06.01.2011, 20:49   #2
DarkLogic
 
Регистрация: 05.12.2010
Сообщений: 5
По умолчанию

includelib import32.lib
extrn ExitProcess:near
extrn WriteConsoleA:near
extrn ReadConsoleA:near
extrn ReadConsoleInputA:near
extrn GetStdHandle:near
extrn Beep:near
extrn Sleep:near
extrn SetConsoleTextAttribute:near
extrn SetConsoleCursorPosition:near
extrn MessageBoxA:near
extrn GetTimeFormatA:near
extrn lstrcmp:near
.386
.model flat,stdcall
.data
Coord struc
x word (?)
y word (?)
Coord ends
Crd Coord ?
timebuff db '00:00:00',0
timerbuff db '00:00:00',0
ns dd ?
buffer dd 256 dup (?)
hin dd ?
hout dd ?
.code
start:
call GetStdHandle,-10
mov hin,eax
call GetStdHandle,-11
mov hout,eax
read_:
call ReadConsoleInputA,hin,offset buffer,1,offset ns,0
cmp word ptr buffer,1h
jne read_
escape_:
cmp byte ptr buffer+14,27
jne endescape_
cmp byte ptr buffer+4,0
jz endescape_
jmp esc_
endescape_:
enter_:
cmp byte ptr buffer+14,9
jne endenter_
cmp byte ptr buffer+4,0
jz endenter_
mov Crd.y,1
mov Crd.x,0
call SetConsoleCursorPosition,hout,Crd
call ReadConsoleA,hin,offset timerbuff,8,offset ns,0
endenter_:
call lstrcmp,offset timebuff,offset timerbuff
cmp eax,0
je b1
jb b_1
jnbe b1_
b1:
call Beep,1000,800
jmp read_
b_1:
call Beep,100,100
jmp read_
b1_:
call Beep,1000,100
jmp read_
esc_:
call Beep,1000,100
call ExitProcess,0
end start

проверял просто сверяя строки символов timebuff timeRbuff удивительно,но событие равенства выполняется, появляяется вопрос что лишеного поподает в timebuff когда получаю время функцией GetTimeFormatA,0,8h,0,0,offset timebuff,9 из-за чего и происходит вся кракозябра?
DarkLogic вне форума Ответить с цитированием
Старый 06.01.2011, 22:28   #3
DarkLogic
 
Регистрация: 05.12.2010
Сообщений: 5
По умолчанию

Остался последний вопрос: как можно сделать чтобы при опросе буфера клавиатуры, если не было нажато ни каких клавиш и ни чего не было сдвинуто (мышь,...), то пропускать ReadConsoleInputA, чтобы время обновлялось?

Код заработавшей программы:
includelib import32.lib
extrn ExitProcess:near
extrn WriteConsoleA:near
extrn ReadConsoleA:near
extrn ReadConsoleInputA:near
extrn GetStdHandle:near
extrn Beep:near
extrn Sleep:near
extrn SetConsoleTextAttribute:near
extrn SetConsoleCursorPosition:near
extrn MessageBoxA:near
extrn GetTimeFormatA:near
extrn lstrcmp:near
.386
.model flat,stdcall
.data
Coord struc
x word (?)
y word (?)
Coord ends
Crd Coord ?
timebuff db '00:00:00_-',0
timerbuff db '00:00:00',0
message db 'Welcome!',0
ns dd ?
buffer dd 256 dup (?)
tit db '----',0
mes db 'mess',0
m dd ?
hin dd ?
hout dd ?
.code
start:
call GetStdHandle,-10
mov hin,eax
call GetStdHandle,-11
mov hout,eax
read_:
call ReadConsoleInputA,hin,offset buffer,1,offset ns,0
;cmp word ptr buffer,1h
;jne time_
escape_:
cmp byte ptr buffer+14,27
jne endescape_
cmp byte ptr buffer+4,0
jz endescape_
jmp esc_
endescape_:
writemessage_:
cmp byte ptr buffer+14,8
jne endwritemessage_
cmp byte ptr buffer+4,0
jz endwritemessage_
call MessageBoxA,0,offset mes,offset tit,0
endwritemessage_:
enter_:
cmp byte ptr buffer+14,9
jne endenter_
cmp byte ptr buffer+4,0
jz endenter_
mov Crd.y,1
mov Crd.x,0
call SetConsoleCursorPosition,hout,Crd
call ReadConsoleA,hin,offset timerbuff,8,offset ns,0
endenter_:
;jmp read_
time_:
call GetTimeFormatA,0,8h,0,0,offset timebuff,9
mov Crd.y,0
mov Crd.x,0
call SetConsoleCursorPosition,hout,Crd
call WriteConsoleA,hout,offset timebuff,8,offset ns,0
call Sleep,501
call lstrcmp,offset timebuff,offset timerbuff
cmp eax,0
jne read_
; jb b_1
; jnbe b1_
b1:
call Beep,1000,800
jmp read_
;b_1:
; call Beep,100,100
; jmp read_
;b1_:
; call Beep,1000,50
; jmp read_
esc_:
call Beep,1000,100
call ExitProcess,0
end start
DarkLogic вне форума Ответить с цитированием
Старый 07.01.2011, 02:12   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Можно вывод времени вынести в Thread. Можно в мультимедийный таймер, он тоже в своём потоке работает. Только cинхронизацию с основным процессом надо продумать.

Например как то так:

Код:
ThreadProc	proc uses ebx edi esi, param:DWORD

ThreadProcZ:
	invoke	Sleep, 500
	invoke GetTimeFormatA,0,8h,0,0,offset timebuff,9
	xor	edx, edx
	invoke SetConsoleCursorPosition,hout, edx
	invoke WriteConsoleA,hout,offset timebuff,8,offset ns,0

	jmp	ThreadProcZ
	xor	eax, eax
	ret
ThreadProc	endp
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 07.01.2011, 14:56   #5
DarkLogic
 
Регистрация: 05.12.2010
Сообщений: 5
По умолчанию

спасибо подумаю,а как можно пропускать команду ReadConsoleInput если ничего не нажималось?
DarkLogic вне форума Ответить с цитированием
Старый 08.01.2011, 18:59   #6
DarkLogic
 
Регистрация: 05.12.2010
Сообщений: 5
По умолчанию

появился другой вопрос, как проверить было ли изменение в буфере клавиатуры?
DarkLogic вне форума Ответить с цитированием
Старый 08.01.2011, 20:45   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Есть такая функция, которая позволяет узнать количество событий во входном буфере консоли.

Цитата:
The GetNumberOfConsoleInputEvents function retrieves the number of unread input records in the console's input buffer.

BOOL GetNumberOfConsoleInputEvents(

HANDLE hConsoleInput, // handle of console input buffer
LPDWORD lpcNumberOfEvents // address for number of events
);


Parameters
hConsoleInput
Identifies the console input buffer. The handle must have GENERIC_READ access.

lpcNumberOfEvents
Points to a 32-bit variable that receives the number of unread input records in the console's input buffer.
И, например, такая конструкция, позволяет постоянно тикать таймеру и при этом следить за кнопками (тут за esc только). Тогда, естественно, ни thread ни таймер не нужны. И вообще, по моему - это правильнее, чем с параллельной нитью.

Код:
next2:
	invoke	GetNumberOfConsoleInputEvents, [hin], addr [ns]
	cmp	eax, 0
	je	exit_err
	cmp	ns, 0
	je	next1
	invoke	ReadConsoleInputA, hin, addr buffer, [ns], addr [tcnt]
	cmp	byte ptr buffer+14, 27
	je	exit

next1:
	invoke	GetTimeFormatA,0,8h,0,0,offset timebuff,9
	invoke	SetConsoleCursorPosition,hout, 0
	invoke	WriteConsoleA,hout,offset timebuff,8,offset ns,0
	invoke	WriteConsoleA,hout,offset end_str,2,offset ns,0
	invoke	Sleep, 100
	jmp	next2

exit:
	invoke Beep,1000,100
exit_err:
	invoke ExitProcess,0
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема сравнения строк securus Общие вопросы C/C++ 7 21.12.2010 03:12
функция,которая выполняет сложение двух чисел,заданных в виде строк 6kakain9 Помощь студентам 3 10.02.2010 17:55
программа для сравнения строк ТМемо MixanMM Компоненты Delphi 2 02.07.2009 13:28
перезапись значений в файле.txt после сравнения SarahConner Общие вопросы Delphi 0 21.03.2009 00:19
сравнение текущего года и месяца с годом и месяцем поступления, а после сравнения записать номер курса Таня84 БД в Delphi 5 11.06.2007 13:53