FASM выровнять 32 секция не выровнена достаточно - PullRequest
2 голосов
/ 29 сентября 2019

я использую FASM, и это моя программа

format ELF64

section '.text' executable

public func

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

я использую AVX, поэтому я создал таблицу (которая должна быть выровнена по 32-байтовой границе) для инициализации регистра ymm0.но когда я пытаюсь скомпилировать эту программу, я получаю " раздел не выровнен достаточно " ошибка от FASM.«.table» должен быть выровнен на границе 32 байта, потому что я использую «movaps» (или movdqa (неважно)).но почему FASM выдает ошибку?это неправильно использовать «выравнивание», как это?

ОБНОВЛЕНИЕ правильно ли делать что-то подобное?потому что, делая это, программа работает без проблем, но это правильный путь?

section '.text' executable

public func

func:
        vmovaps ymm0, YWORD [.table]
        xor     rax, rax
        ret

        section '.rodata' align 32

        .table:
                DQ      1024
                DQ      1024
                DQ      1024
                DQ      1024
                DQ      2048
                DQ      2048
                DQ      2048
                DQ      2048

1 Ответ

2 голосов
/ 29 сентября 2019

С 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

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

...