Пауза на fasm

Applications development, KoOS API questions
  • DockPack ->Sysfunc -> http://prntscr.com/ikyepr
    Из хаоса в космос
  • спасибо за подсказку
    Есть еще вопрос
    хочу сделать бегущую точку по экрану,
    но не могу даже передать переменную в функцию отрисовки точки:

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

    ткните носом плиз что делаю не так
  • iki wrote:ткните носом плиз что делаю не так
    Так ты передаёшь адрес переменной
  • Уточню ответ, изменив авторскую строчку:

    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]
    Last edited by theonlymirage on Thu Mar 15, 2018 5:59 pm, edited 1 time in total.
  • Так будет ошибка компиляции. Надо изменить переменную на dd и тогда достаточно будет

    Code: Select all

    mcall 1, [x], 3, 0x00000000
  • tsdima
    Плюсую, я как раз только дополнил свой ответ выше!

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

    Code: Select all

    x db 0
    ; и потом:
    xor ebx, ebx ;mov ebx, 0 ; обнуляем регистр ebx
    mov bl, byte[x]
    mcall 1, ebx, 3, 0x00000000
    
  • спасибо за очень хороший развернутый ответ,
    но почему я к переменной не могу просто добавить 1
    mcall 1, [x]+1, 3, 0x00000000
    не работает
  • Работай с регистрами:

    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
  • Who is online

    Users browsing this forum: No registered users and 3 guests