С FASM выравнивание внутри секции не может быть больше, чем само выравнивание секции.Если вы не укажете выравнивание раздела, по умолчанию будет 8 для ELF64 и 4 для ELF.Чтобы изменить выравнивание сечения по умолчанию, используйте align
следующим образом:
section '.text' executable align 32
Это должно позволить вам использовать выравнивание до 32 в пределах сечения.Ваш код мог бы выглядеть так:
section '.text' executable align 32
public func
public func2
func:
vmovaps ymm0, YWORD [.table]
xor rax, rax
ret
align 32
.table:
DQ 1024
DQ 1024
DQ 1024
DQ 1024
DQ 2048
DQ 2048
DQ 2048
DQ 2048
func2:
vmovaps ymm0, YWORD [.table]
xor rax, rax
ret
align 32
.table:
DQ 1024
DQ 1024
DQ 1024
DQ 1024
DQ 2048
DQ 2048
DQ 2048
DQ 2048
Вы можете поместить постоянные данные в .rodata
(только для чтения) отдельно от кода в разделе .text
(код).Вы можете иметь несколько функций, используя эти данные.Вы можете размещать разные таблицы и данные и использовать директиву align
внутри разделов, чтобы выровнять конкретные данные, которые могут потребоваться.Этот код не делает ничего полезного, но является примером:
FORMAT ELF64
section '.text' executable
public func
public func2
public func3
public func4
func:
vmovaps ymm0, YWORD [table]
xor rax, rax
ret
func2:
vmovaps ymm0, YWORD [table2]
mov eax, MyStr
ret
func3:
vmovaps ymm0, YWORD [table]
xor rax, rax
ret
func4:
vmovaps ymm0, YWORD [table3]
xor rax, rax
ret
section '.rodata' align 32
MyStr: DB 'Hello There', 0
align 32
table:
DQ 1024
DQ 1024
DQ 1024
DQ 1024
DQ 2048
DQ 2048
DQ 2048
DQ 2048
align 32
table2:
DQ 1024
DQ 1024
DQ 1024
DQ 1024
DQ 2048
DQ 2048
DQ 2048
DQ 2048
table3:
DQ 1024
DQ 1024
DQ 1024
DQ 1024
DQ 2048
DQ 2048
DQ 2048
DQ 2048
Примечание : В этом примере все данные таблицы одинаковы, но в реальной ситуации таблицы будут иметьлюбые подходящие значения, которые вам нужны.