我正在使用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
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
注:在此示例中,所有表数据都是相同的,但在实际情况下,表将具有您需要的任何相关值。