FASM 对齐 32 部分对齐不够

FASM align 32 section is not aligned enough

我正在使用 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,所以我创建了一个 table(必须在 32 字节边界对齐) 初始化 ymm0 寄存器。 但是当我尝试编译这个程序时,我从 FASM 收到“section is not aligned enough”错误。 “.table”必须在 32 字节边界对齐,因为我使用的是 "movaps"(或 movdqa(不管))。但为什么 FASM 给我一个错误? 像这样使用 'align' 是错误的吗?

更新 这样做对吗?因为这样做,程序运行没有任何问题,但这是正确的方法吗?

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

使用 FASM,节内的对齐不能大于节本身的对齐。当您不指定部分的对齐方式时,ELF64 的默认值为 8,ELF 的默认值为 4。要更改默认部分对齐方式,请像这样使用 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(代码)部分中的代码分开。您可以使用该数据拥有多个功能。您可以放置​​不同的 table 和数据,并在节内使用 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

注意:在本例中所有 table 数据都是相同的,但在实际情况下 tables 将具有您需要的任何相关值.