8. Структуры

В FASM, структуры практически тоже самое, что и макросы. Определяются они посредством директивы STRUC:

Синтаксис:

struc name arguments { тело структуры }

Отличае от макросов заключается в том, что в исходном тексте перед структурой должна находиться метка — имя объекта-структуры. Например:

struc a {db 5}

a

это не будет работать. Структуры распознаются только после меток, как здесь:

struc a {db 5}

name a

подобно макросу, это преобразуется препроцессором в:

db 5

Смысл метки в следующем — она будет добавлена ко всем идентификаторам из тела структуры, которые начинаются с точки… Например:

struc a {.local:}

name1 a

name2 a

будет:

name1.local:

name2.local:

Таким образом можно создавать структуры вроде тех, что есть в других языках:

struc rect left,right,top,bottom ;аргументы как у макроса

{

 .left   dd left

 .right  dd right

 .top    dd top

 .bottom dd bottom

}

r1 rect 0,20,10,30

r2 rect ?,?,?,?

получим:

r1.left   dd 0

r1.right  dd 20

r1.top    dd 10

r1.bottom dd 30

r2.left   dd ?

r2.right  dd ?

r2.top    dd ?

r2.bottom dd ?

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

Существуют хитрый приём, позволяющий не указывать аргументы, если они равны 0:

struc ymmv arg

{

 .member dd arg+0

}

y1 ymmv 0xACDC

y2 ymmv

будет:

y1.member dd 0xACDC+0

y2.member dd +0

Как говорилось ранее, если значение аргумента не указанно, то в теле макроса или структуры вместо него ничего не подставляется. В этом примере + используется или как бинарный (то есть с двумя операндами), или как унарный (с одним операндом) оператор.

ПРИМЕЧАНИЕ: часто используется так же макрос или структура struct, которая определяется для расширения возможностей при определении структур. Не путайте struct и struc.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК