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

Узнай цену своей работы

Формулировка задачи:

При программировании на Ассемблере иногда нужно в сегменте данных создавать массив этих данных не всегда но чаще всего это как правило будут символьные данные например:
.data
sTtx db "Мама мыла раму",0
.code
Придерживаясь определённых правил синтаксиса Ассемблера эту форму записи инициализации можно применять не только классически то есть прописывать в начале кода в сегменте данных но можно так же прописать эту форму в теле какой нибудь функции Для того чтобы эту форму записи не много упростить и конкретно для символьных данных с обязательным нулём в конце достаточно написать простейший макрос и для примера у себя в коде можно уже прописать просто
@gp sTxt,"Мама мыла раму"
и ваш макрос под капотом пропишет в этом месте листинга уже правильный синтаксис Ассемблера
.data
sTtx db "Мама мыла раму",0
.code
Сначала я так и сделал кто бы чтобы не говорил это хоть не много но экономит драгоценное время потом я решил немного расширить функционал макроса Теперь подчеркну три раза красным если это хоть кому то интересно могу поделится этим макросом а точнее двумя его подвидами каждый вид имеет два обязательных параметра первый вид это макрос - @gp можно трактовать как (g - глобальная) (p - переменная) записывает данные в сегмент - .data второй вид это макрос - @gc можно трактовать как (g - глобальная) (c - константа) записывает данные в сегмент - .const Эти макросы по сути являются простыми переходниками которые будут заряжать основной макрос - @GLOBALSIMVOL расширенный функционал этого макроса состоит например в том что можно применять более простую запись перехода строки вместо записи (13,10) или (0A0Dh) достаточно просто прописать символ (|) пример:
@gp sTxt,"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
главное правило для того чтобы прописался переход строки это не прописывать этот символ внутри апострофов иначе он превратится в обычный символ и не прописывать его рядом с другими бинарными данными потому что это соответственно вызовет ошибку компилятора его можно прописывать например так как это показано в примере или можно прописать переход строки например в начале так - @gp sTxt,|"Мама....... так - @gp sTxt,|,"Мама....... так - @gp sTxt,13,10,"Мама....... так - @gp sTxt,0A0Dh,"Мама....... ни какой разницы не будет но на мой взгляд первый вариант более удобный для записи Но главный функционал макроса состоит в том что он может записать ваши данные в формате - UNICODE для этого нужно просто перед вторым параметром добавить символ (u) или (U) регистр значение не имеет после этого символа допускаются пробелы или без пробелов для макроса это не имеет ни какого значение этот символ можно трактовать как уменьшительное от - UNICODE пример:
@gp sTxt,u"Мама"||"мыла",2eh,|"!",|||,'раму',|,2eh,2eh
сам я уже давно не пользуюсь макросом - invoke но для того чтобы вам было понятно можно за этим макросом прописать функцию с постфиксом (W)
invoke MessageBoxW,0,addr sTxt,0,32
и вы убедитесь что функция правильно прочитает эти данные в формате - UNICODE Когда макрос будет работать в режиме - UNICODE то для того чтобы правильно записать каждый символ который находится между апострофами в сегмент данных макрос проверит этот символ макрофункцией - @RUSUNICODE и если этот символ окажется из русского алфавита добавит к этому символу нужное смещение если не много изменить пример:
@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
если нам нужны данные в обычном формате аски - ASCII то нам соответственно не нужно в начале второго параметра подставлять символ (u) или (U)
@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
то есть почти тоже самое кроме размера (db или dw) ну и в режиме ASCII макрос не применяет добавочную макрофункцию также макрос не записывает больше двадцати символов в строчке хотя эта информация уже лишняя так как вы это всё равно не сможете увидеть потому что это будет прописано под капотом макроса Так же в первом параметре макроса можно указать один из семи регистров (eax ecx edx ebx esi esi ebp) подобная ситуация может понадобится крайне редко но в макросе это реализованно в качестве бонуса смоделированная ситуация может выглядеть так где нибудь в теле какой нибудь функции можно прописать вот так:
@gp edi,"masm32"||"Ёжик",2eh,|"!",|||,'asm',|,2eh,2eh
Макрос под капотом создаст адрес и запишет его в прописанный регистр и этим адресом можно спокойно воспользоватся
invoke MessageBoxA,0,edi,0,32
В макросе это реализованно так сначала просматривается первый параметр на предмет не регистр ли это здесь макрос задействует макрофункцию - @REGISTR ещё раз повторюсь это просто бонус и не более того Не лишним будет напомнить что у макросов в - masm32 есть определённые ограничения на предмет количества символов в параметрах макроса применить этот макрос вы сможете только если не будет превышано определённое количество символов например при тестировании в режиме - ASCII макрос обработал чуть более (230) символов а в режиме - UNICODE чуть более (220) символов в большинстве случаев я думаю это будет вполне приемлемо но если требуется создать массив данных большего обьёма то тогда придётся применить класическую форму обьявления
.data
sTtx db "........................"
db "............................."
db "............................."
db ".............................",0
.code
Я не буду прописывать эти макросы здесь в теме если кто заинтересован попробывать То может скачать файл здесь в теме или скачать на яндекс-диске Я надеюсь как подключить макросы к своему проекту все прекрасно знают Тестирование этого макроса было относительным так что если у кого нибудь возникнет ошибка то это будет означать что алгоритм макроса увы не доработан Как говорится "Век живи век учись" Чтобы не разводить лишних дебатов на тему "а зачем это нужно" Ещё раз подчеркну три раза красным Эта тема открыта для тех кому это хоть не много интересно

Решение задачи: «Макрос который поможет создать глобальный массив данных»

textual
Листинг программы
@Tick
rept 100000
@Tick

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы