首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FASM对齐32节不够对齐

FASM对齐32节不够对齐
EN

Stack Overflow用户
提问于 2019-09-29 13:49:50
回答 1查看 319关注 0票数 2

我正在使用FASM,这是我的程序

代码语言:javascript
复制
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给了我一个错误?像这样使用“对齐”是错误的吗?

UPDATE这样做是对的吗?因为这样做,程序工作没有任何问题,但它是一个正确的方式吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-29 13:59:19

使用FASM,区段内的对齐不能大于区段对齐本身。当您不指定节的对齐时,ELF64的默认值是8,ELF的默认值是4。要更改默认的节对齐方式,请使用如下所示的align

代码语言:javascript
复制
section '.text' executable align 32

这应该允许您在节中使用多达32的对齐。您的代码可能如下所示:

代码语言:javascript
复制
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指令对齐可能需要的特定数据。这段代码没有做任何有用的事情,但它是一个例子:

代码语言:javascript
复制
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

注意事项:在本例中,所有表数据都是相同的,但在实际情况下,表将具有所需的任何相关值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58155866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档