Page 1 of 1

Пауза на fasm

Posted: Wed Feb 28, 2018 5:31 pm
by iki
Прошу прощения за вопрос чайника
есть какой нибудь макрос для организации паузы при выводе текста в окно формы?

Re: Пауза на fasm

Posted: Wed Feb 28, 2018 6:26 pm
by Leency
DockPack ->Sysfunc -> http://prntscr.com/ikyepr

Re: Пауза на fasm

Posted: Thu Mar 15, 2018 12:57 pm
by iki
спасибо за подсказку
Есть еще вопрос
хочу сделать бегущую точку по экрану,
но не могу даже передать переменную в функцию отрисовки точки:

1.рисую точку так:
mcall 1, 3, 3, 0x00000000
все в порядке
2.если передаю параметр то точка пропадает
объявлю данные
x db 3
рисую точку
mcall 1, x, 3, 0x00000000

ткните носом плиз что делаю не так

Re: Пауза на fasm

Posted: Thu Mar 15, 2018 1:28 pm
by tsdima
iki wrote:ткните носом плиз что делаю не так
Так ты передаёшь адрес переменной

Re: Пауза на fasm

Posted: Thu Mar 15, 2018 5:43 pm
by theonlymirage
Уточню ответ, изменив авторскую строчку:

Code: Select all

mcall 1, byte[x], 3, 0x00000000
Просто x - это адрес метки. По адресу расположен твой байт. Чтобы получить именно содержимое байта по адресу нужно это явно указать как byte[x].
db -- byte
dw -- word
dd -- dword
Остальные пока не понадобятся. =)

Более того регистр ebx не байт, а целых 4. Так что передавать так как я поправил выше нельзя. Смотри описание в документации.

Функция 1 - поставить точку в окне:
Параметры:
* eax = 1 - номер функции
* ebx = x-координата (относительно окна)
* ecx = y-координата (относительно окна)
* edx = 0x00RRGGBB - цвет точки
edx = 0x01xxxxxx - инвертировать цвет точки
(младшие 24 бита игнорируются)
Возвращаемое значение:
* функция не возвращает значения

Заводи:

Code: Select all

x dd 0
и передавай:

Code: Select all

dword[x]

Re: Пауза на fasm

Posted: Thu Mar 15, 2018 5:59 pm
by tsdima
Так будет ошибка компиляции. Надо изменить переменную на dd и тогда достаточно будет

Code: Select all

mcall 1, [x], 3, 0x00000000

Re: Пауза на fasm

Posted: Thu Mar 15, 2018 6:02 pm
by theonlymirage
tsdima
Плюсую, я как раз только дополнил свой ответ выше!

Как ещё вариант:

Code: Select all

x db 0
; и потом:
xor ebx, ebx ;mov ebx, 0 ; обнуляем регистр ebx
mov bl, byte[x]
mcall 1, ebx, 3, 0x00000000

Re: Пауза на fasm

Posted: Fri Mar 16, 2018 10:52 am
by iki
спасибо за очень хороший развернутый ответ,
но почему я к переменной не могу просто добавить 1
mcall 1, [x]+1, 3, 0x00000000
не работает

Re: Пауза на fasm

Posted: Fri Mar 16, 2018 1:16 pm
by theonlymirage
Работай с регистрами:

Code: Select all

inc ebx ; увеличить на единицу значение в регистре ebx
add ebx, 12 ;прибавить 12 к ebx
или памятью (с указанием размера, как уже писали выше), например:

Code: Select all

add dword[x], 30
add byte[x], 13
до системного вызова mcall, при вызове передавай уже готовые значения. Короче расчёты делай заранее, пару лишних строк никому не помешают. Как маленький плюс это упрощает строку визуально и выглядит более универсально (если в будущем вдруг потребуется изменять переменную в зависимости от неких условий).

Описание самого mcall можешь найти в macros.inc и разобраться, вот документация fasm

Положить значение из памяти в регистр так же просто:

Code: Select all

mov eax, dword[x] ;для случая, когда объявлено: x dd 0