1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Полезные макросы для MASM и TASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем Jin X, 10 янв 2017.

  1. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Всё разобрался что к чему.
    Код (ASM):
    1. ; поместить в память или регистр float-значение из памяти или регистра или непосредственого значения
    2. float_set MACRO flt_this:req, param:req
    3. LOCAL first, exit, exit_macro
    4.    exit = 0
    5.    ; если param равен нулю
    6.    FOR arg,<0.0,0.,0>
    7.      IFIDN <arg>,<param>
    8.        and     flt_this, 0
    9.        exit = 1
    10.        EXITM
    11.      ENDIF
    12.    ENDM
    13.    IF exit EQ 1
    14.      GOTO exit_macro
    15.    ENDIF
    16.    ; если param регистр
    17.    FOR arg,<eax,ebx,ecx,edx,esp,ebp,esi,edi>
    18.      IFIDNI <arg>,<param>
    19.        mov     flt_this, param
    20.        exit = 1
    21.        EXITM
    22.      ENDIF
    23.    ENDM
    24.    IF exit EQ 1
    25.      GOTO exit_macro
    26.    ENDIF
    27.    ; если param непосредственое float значения
    28.    first SUBSTR <param>,1,1
    29.    FOR arg,<0,1,2,3,4,5,6,7,8,9,->
    30.      IFIDN first,<arg>
    31.        movflt   flt_this, param
    32.        exit = 1
    33.        EXITM
    34.      ENDIF
    35.    ENDM
    36.    IF exit EQ 1
    37.      GOTO exit_macro
    38.    ENDIF
    39.    ; param это память
    40.    mov     eax, param
    41.    mov     flt_this, eax
    42. :exit_macro
    43. ENDM
    Макрос оптимизирующий, типа как в C++.
     
    Diicorp95 нравится это.
  2. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Вот макрос более оптимальный.
    Код (ASM):
    1. ; найти в списке строк номер совпадающей строки, если не нашли - то возвращает ноль
    2. @SearchStr MACRO str1:req, params:VARARG
    3. LOCAL i, num
    4.    i = 0
    5.    num = 0
    6.    FOR arg,<params>
    7.      i = i + 1
    8.      IFIDNI <str1>,<arg>
    9.        num = i
    10.        EXITM
    11.      ENDIF
    12.    ENDM
    13.    EXITM <num>
    14. ENDM
    15.  
    16. ; поместить в память или регистр float-значение из памяти или регистра или непосредственого значения
    17. float_set MACRO flt_this:req, param:req
    18. ;;   echo param
    19.    ;; если param равен нулю
    20.    IF @SearchStr(<param>,<0.0,0.,0>)
    21.      and     flt_this, 0
    22. ;;     echo is_zero
    23.      EXITM
    24.    ENDIF
    25.    ;; если param регистр
    26.    IF @SearchStr(<param>,<eax,ebx,ecx,edx,esp,ebp,esi,edi>)
    27.      mov     flt_this, param
    28. ;;     echo is_register
    29.      EXITM
    30.    ENDIF
    31.    ;; если param непосредственое float значения
    32.    IF @SearchStr(%@SubStr(<param>,1,1), <0,1,2,3,4,5,6,7,8,9,->)
    33.      movflt   flt_this, param
    34. ;;     echo is_float_const
    35.      EXITM
    36.    ENDIF
    37.    ; param это память
    38.    mov     eax, param
    39.    mov     flt_this, eax
    40. ;;   echo is_memory
    41. ENDM
    Одно не пойму, почему не работает конструкция ELSEIF @SearchStr(...
    То есть, макрофункция в блоке ELSEIF даёт ошибку препроцессора, использую ml от 10-й студии. Это баг? Или ещё что-то.
     
    Diicorp95 нравится это.
  3. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Вектор в МАСМе.
    Структура вектора обычно такая получается.
    Код (ASM):
    1. xr_vector struct ; (sizeof=16, align=4)
    2.    _Alval         dword ?         ; 0     allocator object for values       ; объект{цель} программы распределения для значений
    3.    _Myfirst       dword ?         ; 4     pointer to beginning of array     ; указатель на начало массива
    4.    _Mylast         dword ?         ; 8     pointer to current end of sequence   ; указатель на текущий конец последовательности
    5.    _Myend         dword ?         ; 12   pointer to end of array         ; указатель на конец массива
    6. xr_vector ends                 ; 16
    Теперь надо сделать макросы для работы с этой структурой, макросы имитируют работу методов С++.
    Реализовать можно не все, нужны больше всего insert, erase, back, push_back, pop_back, size и другие.
    Вот тут проблема, как в структуре задать тип содержимого в векторе.
    Типа так:
    Код (ASM):
    1.  
    2. children_invisible           xr_vector <>       ; 112   xr_vector<IRender_Visual *,xalloc<IRender_Visual *> > ?
    За комментированное это результат IDA Pro, то есть надо как то сохранить в структуре строку с названием класса т.е. структуры, что бы макрос знал размер структуры в контейнере.
    В хелпе МАСМ32 указано что есть какие-то дополнительные команды для работы со структурами.
    В общем, кто что предложит. Надо как то в структуре макроконстанту вложить с названием структуры.

    ЗЫ
    Как точно переводится "allocator object for values"?
     
  4. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Обнаружил что МАСМ таки поддерживает виртуальные функции(методы).
    Код (ASM):
    1. ;вызов виртуальной функции
    2. vcall MACRO   _this:REQ, class_name_func:REQ, params:VARARG
    3.    LOCAL num
    4.    IFNB <params>
    5.      num = @InStr(1, <&class_name_func>, <.>)
    6.      .erre num, <"The symbol a point is not found.">
    7.      invoke   (@SubStr(<&class_name_func>, 1, num-1) ptr[eax+12345678h])@SubStr(<&class_name_func>, num), params
    8.      org     $-6
    9.    ENDIF
    10.    IF @SearchStr(<_this>,<ebx,esp,ebp,esi,edi>)
    11.      mov     eax, dword ptr [_this]
    12.      mov     edx, dword ptr [eax+&class_name_func&]
    13.      mov     ecx, _this
    14.    ELSE
    15.      IFDIFI <_this>,<ecx>
    16.      mov     ecx, _this
    17.      ENDIF
    18.      mov     eax, dword ptr [ecx]
    19.      mov     edx, dword ptr [eax+&class_name_func&]
    20.    ENDIF
    21.    call   edx
    22. ENDM
    Но вот код создаёт не очень оптимальный. Здесь стиль аля VS C++, т.е. с оптимизацией.
    Использовать типа так.
    Код (ASM):
    1.  
    2.      mov     ecx, [edi].pSurface
    3.      vcall   ecx, IDirect3DBaseTexture9.GetSurfaceLevel, ecx, 0, addr ppSurfaceLevel
     
  5. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    У кого есть рабочий макрос printf для x64 UASM? У меня что не работает.
     
  6. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    364
    Адрес:
    Кольца Сатурна
    Что значит "не работает"? Что за всеми любимая универсальная злосчастная фраза такая? Как не работает?
    В папке Samples\Win64 есть примеры, ищите внутри по слову printf.
     
  7. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Запихну пока сюда.
    Библиотечные макросы для MS-DOS, т.е. имитируется стандартный набор функций Си. Пока неполный набор.
    scanf решил не делать, из-за сложности реализации и бесконтрольности ввода, заменил на InputInt, потом добавлю InputFloat.
    Так же пример использования, программа вычисления даты пасхи.
    Проверил работоспособность на WinXP 32bit и MS-DOS 2.1 IBM PC 1982 (эмулятор 86BOX, VARCem).
    ЗЫ
    Ах да, ассемблер UASM ver. 2.46!
    ЗЫЫ
    Ключи компиляции
    uasm32 -mz easter.asm
     

    Вложения:

    • macro16.asm
      Размер файла:
      23,4 КБ
      Просмотров:
      151
    • easter.asm
      Размер файла:
      3,6 КБ
      Просмотров:
      156
    Последнее редактирование: 25 фев 2020
  8. Intro

    Intro Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    248
    Тут у меня немного макросов поднакопилось. Выкладываю. А то не сможете откомпилить мой хайкод. ;)

    ЗЫ
    Сделал макрос createSpisok
    Т.к. ассемблер не поддерживает массивы. То сделал такой макрос.
    createSpisok(spisok, sdword, 4, 65, 2, -31, 0, 99, 2, 83, 782, 1)
    Создаёт структуру sSpisok
    Код (ASM):
    1.  
    2. sSpisok struct ;(sizeof=8, align=4)
    3.     pFirst    dword ?    ;//указатель на первый элемент массива
    4.     pLast     dword ?    ;//указатель на последний элемент массива
    5. sSpisok ends
    6.  
    Пример перебора коллекции.
    Код (ASM):
    1.  
    2. .for (esi = spisok.pFirst: esi <= spisok.pLast: esi+=4)
    3.     printf("%d ", dword ptr [esi])
    4. .endfor
    5.  
    Вот как то так заставляем ассемблер быть высокоуровневым!
     

    Вложения:

    • macros.asm
      Размер файла:
      15,3 КБ
      Просмотров:
      4
    Последнее редактирование: 22 фев 2021