我正在使用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给了我一个错误?像这样使用“对齐”是错误的吗?
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发布于 2019-09-29 13:59:19
使用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 (代码)部分中的代码分开。您可以使用该数据拥有多个函数。您可以放置不同的表和数据,并在各节中使用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注意事项:在本例中,所有表数据都是相同的,但在实际情况下,表将具有所需的任何相关值。
https://stackoverflow.com/questions/58155866
复制相似问题