Дата и время публикации:
Управляет выравниванием инициализируемой памятью общего использования в сегменте data .
СИНТАКСИС
.align expression [,pad]АРГУМЕНТЫ
expression — содержит положительное числовое значение счетчика ячеек;
pad — содержит положительное числовое значение, которое заполняет выравниваемую область.
ОПИСАНИЕПрозводит выравнивание путем назначения счетчику ячеек (англ. Location Counter ) внутри сегмента .data значения кратного двум, как показано на рисунке 1.
Рисунок 1.2
На рисунке 1, показано распределение памяти в сегменте data, который осуществляется в результате применения языка програмирования Cи (далее по тексту – С-реализация) для декларации в функции main() переменных с использованием спецификатор класса памяти (англ. storage-class specifiers) static и инициализируемой значением отличного от нуля.
В результате, как следует из рисунка 1 и листинга 2, для одной или более переменных производится установка внутреннего счетчика картного двум, с использованием директивы .align.
Приращение самого счетчика происходит после использования директив .byte, .quad, .long, применение которых показано в листинге 2.
Листинг 2
...
**** static char string[UCHAR_MAX+1] = { 0 }; /* of length 256 bytes */ ;
**** { 'h','e','l','l','o',' ','w','o','r','l','d', '\0' };
...
55 20 .data
56 21 .align 8
57 24 hello.1970:
58 25 0000 68 .byte 104
59 26 0001 65 .byte 101
60 27 0002 6C .byte 108
...
64 28 0003 6C .byte 108
65 29 0004 6F .byte 111
66 30 0005 20 .byte 32
67 31 0006 77 .byte 119
68 32 0007 6F .byte 111
69 33 0008 72 .byte 114
70 34 0009 6C .byte 108
71 35 000a 64 .byte 100
72 36 000b 00 .byte 0
...
73 37 000c 00000000 .align 8
74 40 type_8bytes_maxval.1969:
75 41 0010 FFFFFFFF .quad -1
76 41 FFFFFFFF
77 42 .align 4
78 45 type_4bytes_maxval.1968:
79 46 0018 FFFFFFFF .long -1
80 47 .align 2
81 50 type_2bytes_maxval.1967:
82 54 type_byte_maxval.1966:
83 55 001e FF .byte -1
...
104 DEFINED SYMBOLS
105 *ABS*:0000000000000000 x86_64_typealign.c
...
107 .data:0000000000000000 hello.1969
108 .data:0000000000000010 type_8bytes_maxval.1968
109 .data:0000000000000018 type_4bytes_maxval.1967
110 .data:000000000000001c type_2bytes_maxval.1966
111 .data:000000000000001e type_byte_maxval.1965
...
Как в случае и с директивой .comm выравнивание производится с помощью правила, предложенного Intel и называемого "естественными границами" (англ. "natural boundaries"), потому что все установки значения внутреннего счетчика внутри сегмента .data осуществляются кратными 2, как это показано в строках 107-111 листинга 2
Директива .align предществует явно или не явно до использования директив .byte, .quad, .long, как показано в листинге 2:
- для символа hello.1969 (постоянно выделенный массив С-реализации hello) с применением директивы .byte в строках 58-72, которые дают понять откуда беруться 16 байт;
- для символа type_8bytes_maxval.1968 (переменная С-реализации type_8bytes_maxval) с применением директивы .long в строке 73 с указанием 8-ми байт, отсюда набегают еще 8 байт;
- для символа type_4bytes_maxval.1967 (переменная С-реализации type_4bytes_maxval) с применением директивы .quad в строке 77 с указанием 4-х байт, соответственно дает приращение счетчика на 4 байта;
- для символа type_2bytes_maxval.1966 (переменная С-реализации type_2bytes_maxval) и символа type_byte_maxval.1965 (переменная С-реализации type_byte_maxval ) в строке 80 с указанием 2-х байт, что дает приращаение счетчика еще на два байта.
Библиография
См. п.п.36-38 общей библиографии