Объединения (union) также позволяют определить свой тип данных и также хранят набор элементов, но в отличие от структуры все элементы объединения имеют нулевое смещение. А это значит, что разные элементы занимают в памяти один и тот же участок, то есть в памяти они накладываются друг на друга.
Для определения объединений применяется ключевое слово union и следующий формальный синтаксис:
имя_объединения union поля объединения имя_объединения ends
Например, определим простейшее объединение, которое хранит символ и его числовой код из таблицы ASCII:
char union ; объединение char представляет символ таблицы ASCII letter byte ? ; символ num_code dword ? ; его числовой код char ends
Здесь определено объединение с именем char, которое хранит в одном и том же участки памяти объект dword (числовой код символа) и объект byte (сам символ). В итоге это объединение будет занимать 4 байта, и младший байт будет общим для переменной letter и num_code. Таким образом, объединение позволяет сэкономить на размее памяти.
Затем мы можем создать переменную, которая представляет данное объединение:
.data symbol char {}
Здесь переменная объединения char называется symbol. Для определения объединения применяются фигурные скобки {}.
Для обращения к полям объединения используется точечная нотация - после имени объединения ставится точка и имя поля:
char union ; структура представляет символ таблицы ASCII letter byte ? ; символ num_code dword ? ; его числовой код char ends .data symbol char {} .code main proc mov rdx, "c" mov symbol.letter, dl ; устанавливаем значение letter mov eax, symbol.num_code ; EAX = 99 - код символа c ret main endp end
Здесь в регистр rdx помещается символ "c", который имеет код 99 в таблице ASCII. Далее этот символ передаем в переменную letter. Но поскольку переменная letter представляет младший байт переменной num_code, то num_code также будет содержать значение 99.