· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Организация циклов при вызове API

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Мар 11, 2004 10:48:06

Привет всем! Статья Великого гуру [C] Serrgio / HI-TECH "Win32ASM: "Hello, World" и три халявы MASM32" погрузила меня в глубокие раздумья, натолкнув на банальные с точки зрения продвинутых вопросы. Самый простой и дурацкий: как, например, можно зациклить вызов API, представленный в строчке invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL. Т.е. как организовать цикл вывода на экран N раз? Поможете? С грустью и уважением.


Дата: Мар 11, 2004 11:27:13

serge
А без API циклы делать умеешь?


Дата: Мар 11, 2004 23:15:32

Да также, только если используешь регистры eax, ecx или edx, то их перед вызовом лучше сохранять, а ещё лучше не использовать:

mov ebx, N
@@loop:
invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL
dec ebx
jnz @@loop


Дата: Мар 12, 2004 00:21:43

Кажется в некоторых функциях ebx не сохраняется, стрёмно..


Дата: Мар 12, 2004 01:02:05

бррр.
а pusha\popa не сделать?


Дата: Мар 12, 2004 02:30:45

Нафига?
Достаточно: push/pop
Но лучше использовать другой регистр, который гарантировано обязан сохранятся функцией.


Дата: Мар 12, 2004 02:31:52

Да и вопрос не в том сделать не сделать, нужно корректные примеры постить ;-)


Дата: Мар 12, 2004 10:33:42

dragon
Ого! Работает! Спасибо! Раз такое дело, может намекнете: ebx - единственно пригодный для организации цикла в данном случае? А как, например, организовать классику с использованием счетчика цикла
mov (e)cx, N
metka:
...
loop metka
или более глобально: как использовать любой (не ebx) регистр? Может, я просто путаюсь с push-pop'aми (получаю все время бесконечный цикл)? С уважением.


Дата: Мар 12, 2004 10:36:36

serge
я просто путаюсь с push-pop'aми (получаю все время бесконечный цикл)
Т.е. api не при чем!


Дата: Мар 12, 2004 10:36:52

q_q
Угу.


Дата: Мар 12, 2004 10:54:24 · Поправил: q_q

serge
...
mov reg,N
or reg,reg
jz lab1
lab0:
push reg
... ; тело цикла
pop reg
dec reg
jnz lab0
lab1:
...


Дата: Мар 12, 2004 10:55:18

Win API теоретически не должно изменять EBX, ESI, EDI, EBP, ESP.
Так что можно мспользовать любой из них. (ESP лучше не трогать ;-)

Если хочешь другой, сохраняй его в стеке:
mov ecx, N
@@:
push ecx
invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL
pop ecx
loop @b


Можно совсем без регистров, иногда полезно:
push N  ;;  локальная переменная-счетчик
@@:
invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL
dec dword [esp]
jnz @b
pop edx  ;;  выравниваем стек. (edx все равно испорчен API, теперь в нем будет 0)


Asterix
Дык и EBX обязан сохраняться, напиши микрософту ;-)


Дата: Мар 12, 2004 12:49:23

S_T_A_S_
выравниваем стек. (edx все равно испорчен API, теперь в нем будет 0)
add esp,4?


Дата: Мар 12, 2004 15:43:07

Всем thank's!
Медитирую...


Дата: Мар 12, 2004 17:01:18

[ q_q: add esp,4?]

В данном случае pop edx круче, всего 1 byte

[ S_T_A_S_: Дык и EBX обязан сохраняться, напиши микрософту ;-)]

Да, действительно, вроде сохраняется ;-), я его почему-то мысленно приплёл к eax, edx, ecx ;-)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.171