Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
1

Как приостановить программу на MASM?

09.11.2016, 23:36. Просмотров 779. Ответов 32
Метки нет (Все метки)

Есть программа, работает отлично (сам писал )), но возникла нужда.
Хотелось бы, чтоб она после определённых действий приостановилась
и ожидала нажатия любой клавиши, а после продолжила свою работу.
Ось win7,masm32.
Спасибо за любую помощь или намёк.

Добавлено через 1 час 31 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
include \MASM32\macros\macro1.ASM
_start
 
.data
v dd 890
v1 dd 460
p dd 990
p1 dd 550
l dd 804
l1 dd 542
.code
go:
mov ecx,15
qwe1:
push ecx
;тут надо тормознуть
call nauka
son 500 
pop ecx
loop qwe1
 
exit
nauka proc
core <poz v,v1>,<son 500>,<l2_mouse>
core <poz p,p1>,<son 500>,<l2_mouse>
core <poz l,l1>,<son 500>,<l2_mouse>
ret
nauka endp
end go
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2016, 23:36
Ответы с готовыми решениями:

как приостановить программу?
имеется необходимость приостановить работу программы либо средствами биоса, либо иными средствами,...

Как интерпретировать эту программу в MASM?
.MODEL SMALL .STACK 256 .DATA stroka db '0123456789','$' .CODE start: mov ax, @Data mov ds,...

Разбить программу на функции в MASM
Всем доброго времени суток. Друзья у меня такая проблемка хочу программу как то разбить на кусочки...

Как приостановить программу?
Как сделать приостановку программы? Sleep это не то, оно полностью останавливает программу, а мне...

Приостановить программу
Вот код: procedure TForm1.Button1Click(Sender: TObject); begin icq.UIN := 2323323; icq.password...

32
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
09.11.2016, 23:59 2
Программа консольная? Вот пример ожидания нажатия клавиши
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
; ml /coff /c !.asm
; link /subsystem:console !.obj
 
.586P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE WINDOWS.INC
INCLUDE KERNEL32.INC
INCLUDELIB KERNEL32.LIB
 
.DATA
 
InputRec INPUT_RECORD <>
ReallyRead dd ?
 
.CODE
 
Start:
 
  invoke GetStdHandle, STD_INPUT_HANDLE
  xchg ebx,eax
@@LoopInput:
  invoke ReadConsoleInput, ebx, offset InputRec, 1, offset ReallyRead
  or eax,eax
  jz @@Error
  cmp InputRec.EventType, KEY_EVENT
  jne @@LoopInput
  cmp InputRec.KeyEvent.bKeyDown, 0
  je @@LoopInput
@@Error:
 
  invoke ExitProcess, NULL
 
END Start
p.s. Не забывайте использовать теги [asm][/asm].
1
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 00:19  [ТС] 3
Спс, попробую вставить.

Добавлено через 14 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
include \MASM32\macros\macro1.ASM
_start
 
.data
v dd 890
v1 dd 460
p dd 990
p1 dd 550
l dd 804
l1 dd 542
InputRec INPUT_RECORD <>
ReallyRead dd ?
.code
go:
mov ecx,3
qwe1:
push ecx
call nauka
son 500 
call pauza
pop ecx
loop qwe1
 
exit
 
pauza proc
  invoke GetStdHandle, STD_INPUT_HANDLE
  xchg ebx,eax
@@LoopInput:
  invoke ReadConsoleInput, ebx, offset InputRec, 1, offset ReallyRead
  or eax,eax
  jz @@Error
  cmp InputRec.EventType, KEY_EVENT
  jne @@LoopInput
  cmp InputRec.KeyEvent.bKeyDown, 0  
  je @@LoopInput
@@Error:
ret
pauza endp
nauka proc
core <poz v,v1>,<son 500>,<l2_mouse>
core <poz p,p1>,<son 500>,<l2_mouse>
core <poz l,l1>,<son 500>,<l2_mouse>
ret
nauka endp
end go
не помогло(
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 00:34 4
Как компилите, напишите опции. И желательно прогу целиком.
Потому что код рабочий.

Добавлено через 2 минуты
Вероятно, у вас прога не консольная, вот и вся проблема...
0
10.11.2016, 00:34
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 00:54  [ТС] 5
она просто двигает мышку и кликает
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 01:07 6
IskateJIb, кто "она"?
Вы команды, которыми компилируете прогу, можете написать сюда?
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 01:09  [ТС] 7
IDE RadAsm

она, это программа
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 01:14 8
Так, у вас программа консольная или GUI ?
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 01:23  [ТС] 9
Я самоучка, поэтому консольная или нет, вам по коду лучше понять.
Просто мышка кликает по координатам и ни каких окон.
0
карбид
Заблокирован
10.11.2016, 03:23 10
Jin X, IskateJIb, вот что соорудил из ваших программ ( у меня работает ). Метки, текст, ставил для отладки...
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
.586P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
;include \masm32\macros\macro1.ASM
INCLUDE \masm32\include\WINDOWS.INC
INCLUDE \masm32\include\KERNEL32.INC
INCLUDELIB KERNEL32.LIB
 
SetConsoleTitleA PROTO:DWORD
GetStdHandle PROTO:DWORD
WriteConsoleA PROTO:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
 
.DATA
sConsoleTitle   db 'My Console Application',0
Text1       db 'Hello, World!',0
Text2       db 'msg 2',0
hStdout     dd 0
Counter     dd 0
 
v   dd 890
v1  dd 460
p   dd 990
p1  dd 550
l   dd 804
l1  dd 542
 
InputRec INPUT_RECORD <>
ReallyRead dd ?
 
.CODE
 
nauka proc
;core <poz v,v1>,<son 500>,<l2_mouse>
;core <poz p,p1>,<son 500>,<l2_mouse>
;core <poz l,l1>,<son 500>,<l2_mouse>
ret
nauka endp
 
Start:
 
; Title console.
push offset sConsoleTitle
call SetConsoleTitleA
 
; Get handle.
push -11
call GetStdHandle
mov hStdout,EAX
 
AGAIN:
push 0
push 0
push 13
 
cmp [Counter], 0
je T1
cmp [Counter], 1
je T2
cmp [Counter], 2
je @@Error
 
T1:
push offset Text1
jmp PRINT
 
T2:
push offset Text2
;jmp PRINT
 
PRINT:
push hStdout
call WriteConsoleA
 
mov ecx,15
qwe1:
push ecx
 
;тут надо тормознуть
call Pause
 
inc [Counter]
jmp AGAIN
 
call nauka
 
;son 500 
pop ecx
loop qwe1
 
@@Error:
invoke ExitProcess, NULL
 
Pause proc
invoke GetStdHandle, STD_INPUT_HANDLE
xchg ebx,eax
@@10:
invoke ReadConsoleInput, ebx, offset InputRec, 1, offset ReallyRead
or eax,eax
jz @@99
cmp InputRec.EventType, KEY_EVENT
jne @@10
cmp InputRec.KeyEvent.bKeyDown, 0
je @@10
@@99:
ret
Pause endp
 
END Start

Bat - файл для компиляции

Код
call masm_set
ml /c /coff /Cp HelloWorld.asm
pause
link /subsystem:console /libpath:d:\tools\masm32\lib HelloWorld.obj
pause
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 05:14  [ТС] 11
Спс, твой вариант работает, но это не совсем то что нужно .
А непосредственно код паузы ковырнуть оттуда можно?
Будем пробовать)).
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 10:50 12
IskateJIb, код паузы там тот же.
По приведённому Вами куску кода определить тип программы (консольная или GUI) нельзя, это можно определить по ключам компилятора (в частности, /subsystem:console или /subsystem:windows) или хотя бы по полному коду программы (хотя тоже не факт). Ну, или как вариант, что происходит при запуске программы: открывается ли консольное (чёрное обычно) окошко или нет?

Цитата Сообщение от IskateJIb Посмотреть сообщение
не помогло(
По такому ответу вообще не понятно: то ли прога не компилируется, то ли не работает, то ли ещё что-то... Пишите конкретнее.

Если программа не консольная (т.е. "чёрное окошко" не появляется) и нужно ждать нажатия клавиши, находясь в любой программы (т.е. не создавая и активируя своё видимое окно), придётся ставить хук, причём для этого нужно будет писать отдельную DLL-ку. О хуках много информации в интернете, например:
http://rsdn.org/article/baseserv/winhooks.xml
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 19:12  [ТС] 13
/subsystem:windows
Окон нет, просто мышь встаёт на координату(клик), тут надо ждать нажатия клавиши, встаёт на координату(клик), выход.
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 19:50 14
Понятно, тогда хуки. По-другому не знаю как и вряд ли есть какой-то другой вариант. Разве что зарегистрировать "горячую клавишу" (RegisterHotKey) и ждать именно её нажатия. Но для этого нужно создать невидимое окно.
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 20:01  [ТС] 15
Да,да,да, это тоже подойдёт, а как?
Хоть намёк или примерчик можно?))
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 21:23 16
Можно и без окон обойтись, оказывается...
Вот рабочая прога. Пути к .INC и .LIB проставьте сами.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
.586P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE WINDOWS.INC
INCLUDE KERNEL32.INC
INCLUDE USER32.INC
INCLUDELIB KERNEL32.LIB
INCLUDELIB USER32.LIB
 
.DATA
 
MsgHotKey db 'HotKey is pressed!',0
MsgError db 'HotKey register error!',0
MyTitle db 'HotKey Demo',0
Message MSG <>
HOTKEY_ID = 0
 
.CODE
 
Start:
 
  invoke RegisterHotKey, 0, HOTKEY_ID, MOD_CONTROL, VK_Z  ; регистрируем горячую клавишу Ctrl+Z
  .IF eax != 0
 
; Цикл получения сообщений от системы
@@Wait:
  invoke GetMessage, offset Message, 0, 0, 0
  or eax,eax
  jz @@Exit  ; программе посылается сообщение о выходе
  .IF (Message.message == WM_HOTKEY) && (Message.wParam == HOTKEY_ID)
    jmp @@Finish
  .ENDIF
;  invoke TranslateMessage, offset Message  ; эти две функции нужны только
;  invoke DispatchMessage, offset Message  ; для оконных обработчиков сообщений
  jmp @@Wait
@@Finish:
 
  invoke UnregisterHotKey, 0, HOTKEY_ID  ; удаляем горячую клавишу
  invoke MessageBox, 0, offset MsgHotKey, offset MyTitle, MB_OK or MB_ICONINFORMATION or MB_SYSTEMMODAL or MB_SETFOREGROUND
  .ELSE
  
  invoke MessageBox, 0, offset MsgError, offset MyTitle, MB_OK or MB_ICONERROR or MB_SYSTEMMODAL or MB_SETFOREGROUND
  .ENDIF
 
@@Exit:
  invoke ExitProcess, NULL
 
END Start
Разумеется, можно зарегистрировать горячую клавишу один раз. И один раз её удалить перед выходом.
p.s. Кстати, можно зарегистрировать даже простую клавишу, типа буквы 'Z' или Enter.
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
10.11.2016, 23:05  [ТС] 17
Cпасибо, буду пробовать )

Добавлено через 1 час 20 минут
Работает, но после паузы окошко вылазит и переводит внимание на себя.
Приходится его закрывать, а может попробовать вместо окна пикнуть бипером( invoke Beep)?
Как думаете ?
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
10.11.2016, 23:43 18
Так, это ж пример, поэтому окошко и вылезает
Что хотите, то и делайте. Убирайте окошко и пуикайте, мяукайте, женщину на весь экран выводите, денег требуйте (хотя нет, денег требовать не надо) – всё, что душе угодно, в общем
0
IskateJIb
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 19
11.11.2016, 01:22  [ТС] 19
Спс огромное, правда не пикает, но и окно не вылазит.
Выручил, ещё раз СПС).
0
Jin X
5289 / 1456 / 169
Регистрация: 14.12.2014
Сообщений: 2,810
Записей в блоге: 11
Завершенные тесты: 3
11.11.2016, 01:39 20

Не по теме:

IskateJIb, ну если ещё раз и ещё раз, то справа есть кнопочка "Спасибо" - мне будет приятно ;)



Добавлено через 1 минуту
Через PlaySound можно звук вывести ещё (в т.ч. стандартные без загрузки файлов и ресурсов).
1
11.11.2016, 01:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2016, 01:39

не могу приостановить программу
дано задание Дана точка A(x; y) на координатной плоскости. Определить, принадлежит ли она...

Скорочтение (приостановить программу в консольном окне на некоторое время)
Как приостановить программу в консольном окне на некоторое время, чтоб потом она автоматически...

Перевести программу с masm на fasm
есть прога на масме надо переделать ее дл фасма


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru