Макрос который поможет создать глобальный массив данных - Assembler
Формулировка задачи:
При программировании на Ассемблере
иногда нужно в сегменте данных создавать массив этих данных
не всегда но чаще всего это как правило будут символьные данные
например:
Придерживаясь определённых правил синтаксиса Ассемблера
эту форму записи инициализации можно применять не только классически
то есть прописывать в начале кода в сегменте данных
но можно так же прописать эту форму в теле какой нибудь функции
Для того чтобы эту форму записи не много упростить
и конкретно для символьных данных с обязательным нулём в конце
достаточно написать простейший макрос
и для примера у себя в коде можно уже прописать просто
и ваш макрос под капотом пропишет в этом месте листинга
уже правильный синтаксис Ассемблера
Сначала я так и сделал кто бы чтобы не говорил
это хоть не много но экономит драгоценное время
потом я решил немного расширить функционал макроса
Теперь подчеркну три раза красным
если это хоть кому то интересно
могу поделится этим макросом а точнее двумя его подвидами
каждый вид имеет два обязательных параметра
первый вид это макрос - @gp
можно трактовать как (g - глобальная) (p - переменная)
записывает данные в сегмент - .data
второй вид это макрос - @gc
можно трактовать как (g - глобальная) (c - константа)
записывает данные в сегмент - .const
Эти макросы по сути являются простыми переходниками
которые будут заряжать основной макрос - @GLOBALSIMVOL
расширенный функционал этого макроса состоит например в том
что можно применять более простую запись перехода строки
вместо записи (13,10) или (0A0Dh)
достаточно просто прописать символ (|)
пример:
главное правило для того чтобы прописался переход строки
это не прописывать этот символ внутри апострофов
иначе он превратится в обычный символ
и не прописывать его рядом с другими бинарными данными
потому что это соответственно вызовет ошибку компилятора
его можно прописывать например так как это показано в примере
или можно прописать переход строки например в начале
так - @gp sTxt,|"Мама.......
так - @gp sTxt,|,"Мама.......
так - @gp sTxt,13,10,"Мама.......
так - @gp sTxt,0A0Dh,"Мама.......
ни какой разницы не будет
но на мой взгляд первый вариант более удобный для записи
Но главный функционал макроса состоит в том
что он может записать ваши данные в формате - UNICODE
для этого нужно просто перед вторым параметром
добавить символ (u) или (U) регистр значение не имеет
после этого символа допускаются пробелы или без пробелов
для макроса это не имеет ни какого значение
этот символ можно трактовать как уменьшительное от - UNICODE
пример:
сам я уже давно не пользуюсь макросом - invoke
но для того чтобы вам было понятно
можно за этим макросом прописать функцию с постфиксом (W)
и вы убедитесь что функция правильно прочитает
эти данные в формате - UNICODE
Когда макрос будет работать в режиме - UNICODE
то для того чтобы правильно записать каждый символ
который находится между апострофами в сегмент данных
макрос проверит этот символ макрофункцией - @RUSUNICODE
и если этот символ окажется из русского алфавита
добавит к этому символу нужное смещение
если не много изменить пример:
то под капотом бы мы увидели что макрос
в этом месте листинга прописал бы
если нам нужны данные в обычном формате аски - ASCII
то нам соответственно не нужно в начале второго параметра
подставлять символ (u) или (U)
и под капотом бы мы увидели
то есть почти тоже самое кроме размера (db или dw)
ну и в режиме ASCII макрос не применяет добавочную макрофункцию
также макрос не записывает больше двадцати символов в строчке
хотя эта информация уже лишняя так как вы это всё равно
не сможете увидеть потому что это будет прописано под капотом макроса
Так же в первом параметре макроса
можно указать один из семи регистров (eax ecx edx ebx esi esi ebp)
подобная ситуация может понадобится крайне редко
но в макросе это реализованно в качестве бонуса
смоделированная ситуация может выглядеть так
где нибудь в теле какой нибудь функции
можно прописать вот так:
Макрос под капотом создаст адрес
и запишет его в прописанный регистр
и этим адресом можно спокойно воспользоватся
В макросе это реализованно так
сначала просматривается первый параметр
на предмет не регистр ли это
здесь макрос задействует макрофункцию - @REGISTR
ещё раз повторюсь это просто бонус и не более того
Не лишним будет напомнить что у макросов в - masm32
есть определённые ограничения
на предмет количества символов в параметрах макроса
применить этот макрос вы сможете только если
не будет превышано определённое количество символов
например при тестировании в режиме - ASCII
макрос обработал чуть более (230) символов
а в режиме - UNICODE чуть более (220) символов
в большинстве случаев я думаю это будет вполне приемлемо
но если требуется создать массив данных большего обьёма
то тогда придётся применить класическую форму обьявления
Я не буду прописывать эти макросы здесь в теме
если кто заинтересован попробывать
То может скачать файл здесь в теме
или скачать на яндекс-диске
Я надеюсь как подключить макросы к своему проекту все прекрасно знают
Тестирование этого макроса было относительным
так что если у кого нибудь возникнет ошибка
то это будет означать что алгоритм макроса увы не доработан
Как говорится
"Век живи век учись"
Чтобы не разводить лишних дебатов на тему
"а зачем это нужно"
Ещё раз подчеркну три раза красным
Эта тема открыта для тех кому это хоть не много интересно
.data sTtx db "Мама мыла раму",0 .code
@gp sTxt,"Мама мыла раму"
.data sTtx db "Мама мыла раму",0 .code
@gp sTxt,"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
@gp sTxt,u"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
invoke MessageBoxW,0,addr sTxt,0,32
@gp sTxt,u"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
.data sTxt dw "m","a","s","m","3","2",13,10,13,10,"Ё"+857,"ж"+848,"и"+848,"к"+848,2eh,13,10,"!",13,10 dw 13,10,13,10,'a','s','m',13,10,2eh,2eh,0 .code
@gp sTxt,"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
.data sTxt db "m","a","s","m","3","2",13,10,13,10,"Ё","ж","и","к",2eh,13,10,"!",13,10 db 13,10,13,10,'a','s','m',13,10,2eh,2eh,0 .code
@gp edi,"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
invoke MessageBoxA,0,edi,0,32
.data sTtx db "........................" db "............................." db "............................." db ".............................",0 .code
Решение задачи: «Макрос который поможет создать глобальный массив данных»
textual
Листинг программы
@Tick rept 100000 @Tick
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д