Макрос который поможет создать глобальный массив данных

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 11 май 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    При программировании на Ассемблере
    иногда нужно в сегменте данных создавать массив этих данных
    не всегда но чаще всего это как правило будут символьные данные
    например:

    Код (ASM):
    1. .data
    2. sTtx db "Мама мыла раму",0
    3. .code
    Придерживаясь определённых правил синтаксиса Ассемблера
    эту форму записи инициализации можно применять не только классически
    то есть прописывать в начале кода в сегменте данных
    но можно так же прописать эту форму в теле какой нибудь функции

    Для того чтобы эту форму записи не много упростить
    и конкретно для символьных данных с обязательным нулём в конце
    достаточно написать простейший макрос
    и для примера у себя в коде можно уже прописать просто

    Код (ASM):
    1. @gp sTxt,"Мама мыла раму"
    и ваш макрос под капотом пропишет в этом месте листинга
    уже правильный синтаксис Ассемблера

    Код (ASM):
    1. .data
    2. sTtx db "Мама мыла раму",0
    3. .code
    Сначала я так и сделал кто бы чтобы не говорил
    это хоть не много но экономит драгоценное время
    потом я решил немного расширить функционал макроса

    Теперь подчеркну три раза красным
    если это хоть кому то интересно
    могу поделится этим макросом а точнее двумя его подвидами
    каждый вид имеет два обязательных параметра

    первый вид это макрос - @gp
    можно трактовать как (g - глобальная) (p - переменная)
    записывает данные в сегмент - .data

    второй вид это макрос - @gc
    можно трактовать как (g - глобальная) (c - константа)
    записывает данные в сегмент - .const

    Эти макросы по сути являются простыми переходниками
    которые будут заряжать основной макрос - @GLOBALSIMVOL
    расширенный функционал этого макроса состоит например в том
    что можно применять более простую запись перехода строки
    вместо записи (13,10) или (0A0Dh)
    достаточно просто прописать символ (|)
    пример:

    Код (ASM):
    1. @gp sTxt,"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
    главное правило для того чтобы прописался переход строки
    это не прописывать этот символ внутри апострофов
    иначе он превратится в обычный символ
    и не прописывать его рядом с другими бинарными данными
    потому что это соответственно вызовет ошибку компилятора
    его можно прописывать например так как это показано в примере
    или можно прописать переход строки например в начале

    так - @gp sTxt,|"Мама.......
    так - @gp sTxt,|,"Мама.......
    так - @gp sTxt,13,10,"Мама.......
    так - @gp sTxt,0A0Dh,"Мама.......

    ни какой разницы не будет
    но на мой взгляд первый вариант более удобный для записи

    Но главный функционал макроса состоит в том
    что он может записать ваши данные в формате - UNICODE
    для этого нужно просто перед вторым параметром
    добавить символ (u) или (U) регистр значение не имеет
    после этого символа допускаются пробелы или без пробелов
    для макроса это не имеет ни какого значение
    этот символ можно трактовать как уменьшительное от - UNICODE
    пример:

    Код (ASM):
    1. @gp sTxt,u"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
    сам я уже давно не пользуюсь макросом - invoke
    но для того чтобы вам было понятно
    можно за этим макросом прописать функцию с постфиксом (W)

    Код (ASM):
    1. invoke MessageBoxW,0,addr sTxt,0,32
    и вы убедитесь что функция правильно прочитает
    эти данные в формате - UNICODE

    Когда макрос будет работать в режиме - UNICODE
    то для того чтобы правильно записать каждый символ
    который находится между апострофами в сегмент данных
    макрос проверит этот символ макрофункцией - @RUSUNICODE
    и если этот символ окажется из русского алфавита
    добавит к этому символу нужное смещение
    если не много изменить пример:

    Код (ASM):
    1. @gp sTxt,u"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
    то под капотом бы мы увидели что макрос
    в этом месте листинга прописал бы

    Код (ASM):
    1. .data
    2. sTxt dw "m","a","s","m","3","2",13,10,13,10,"Ё"+857,"ж"+848,"и"+848,"к"+848,2eh,13,10,"!",13,10
    3. dw 13,10,13,10,'a','s','m',13,10,2eh,2eh,0
    4. .code
    если нам нужны данные в обычном формате аски - ASCII
    то нам соответственно не нужно в начале второго параметра
    подставлять символ (u) или (U)

    Код (ASM):
    1. @gp sTxt,"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
    и под капотом бы мы увидели

    Код (ASM):
    1. .data
    2. sTxt db "m","a","s","m","3","2",13,10,13,10,"Ё","ж","и","к",2eh,13,10,"!",13,10
    3. db 13,10,13,10,'a','s','m',13,10,2eh,2eh,0
    4. .code
    то есть почти тоже самое кроме размера (db или dw)
    ну и в режиме ASCII макрос не применяет добавочную макрофункцию
    также макрос не записывает больше двадцати символов в строчке
    хотя эта информация уже лишняя так как вы это всё равно
    не сможете увидеть потому что это будет прописано под капотом макроса

    Так же в первом параметре макроса
    можно указать один из семи регистров (eax ecx edx ebx esi esi ebp)
    подобная ситуация может понадобится крайне редко
    но в макросе это реализованно в качестве бонуса
    смоделированная ситуация может выглядеть так
    где нибудь в теле какой нибудь функции
    можно прописать вот так:

    Код (ASM):
    1. @gp edi,"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
    Макрос под капотом создаст адрес
    и запишет его в прописанный регистр
    и этим адресом можно спокойно воспользоватся

    Код (ASM):
    1. invoke MessageBoxA,0,edi,0,32
    В макросе это реализованно так
    сначала просматривается первый параметр
    на предмет не регистр ли это
    здесь макрос задействует макрофункцию - @REGISTR
    ещё раз повторюсь это просто бонус и не более того

    Не лишним будет напомнить что у макросов в - masm32
    есть определённые ограничения
    на предмет количества символов в параметрах макроса
    применить этот макрос вы сможете только если
    не будет превышано определённое количество символов
    например при тестировании в режиме - ASCII
    макрос обработал чуть более (230) символов
    а в режиме - UNICODE чуть более (220) символов
    в большинстве случаев я думаю это будет вполне приемлемо
    но если требуется создать массив данных большего обьёма
    то тогда придётся применить класическую форму обьявления

    Код (ASM):
    1. .data
    2. sTtx db "........................"
    3. db "............................."
    4. db "............................."
    5. db ".............................",0
    6. .code
    Я не буду прописывать эти макросы здесь в теме
    если кто заинтересован попробывать
    То может скачать файл здесь в теме
    или скачать на яндекс-диске

    https://yadi.sk/d/lrga8-z-3J493D

    Я надеюсь как подключить макросы к своему проекту все прекрасно знают

    Тестирование этого макроса было относительным
    так что если у кого нибудь возникнет ошибка
    то это будет означать что алгоритм макроса увы не доработан
    Как говорится

    "Век живи век учись"

    Чтобы не разводить лишних дебатов на тему

    "а зачем это нужно"

    Ещё раз подчеркну три раза красным
    Эта тема открыта для тех кому это хоть не много интересно
     

    Вложения:

    • macro.txt
      Размер файла:
      6 КБ
      Просмотров:
      527
    Indy_ нравится это.
  2. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    убрал лишний макрос фильтр русских символов
    подправил основную макропроцедуру
    новый алгоритм во вложенном файле
     

    Вложения:

    • macro2.txt
      Размер файла:
      3,8 КБ
      Просмотров:
      539