FASM对齐32的部分对齐不充分

问题描述 投票:2回答:1

我正在使用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

im使用AVX,所以我创建了一个表(必须在32字节边界处对齐)初始化ymm0寄存器。但是当我尝试编译该程序时,我从FASM收到“ 节的对齐不够充分”错误。 “ .table”必须在32字节边界对齐,因为我使用的是“ movaps”(或movdqa(无所谓))。但是为什么FASM给我一个错误?这样使用'align'是错误的吗?

UPDATE做这样的事对吗?因为这样做可以使程序正常运行,但这是正确的方法吗?

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
assembly x86 sse memory-alignment fasm
1个回答
1
投票
使用FASM,截面内部的对齐方式不能大于截面内部本身的对齐方式。如果不指定节的对齐方式,则默认为ELF64 8,ELF4 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(只读)中。使用该数据,您可以具有多种功能。您可以放置​​不同的表和数据,并在节内使用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

注:在此示例中,所有表数据都是相同的,但在实际情况下,表将具有您需要的任何相关值。

© www.soinside.com 2019 - 2024. All rights reserved.