Объединения union

Последнее обновление: 02.07.2023

Объединения (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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850