气苹果语法错误

Gas apple syntax error

我尝试将此汇编文件:https://github.com/gvanas/KeccakCodePackage/blob/master/SnP/KeccakF-1600/OptimizedAsmX86-64/KeccakF-1600-x86-64-gas.s 转换为 apple 语法。 (旧语法)

我将 .eq 替换为 #define,将 .global 替换为 .globl,删除 .type、.size。

又出现了一些错误(我用的是clang):

1 --

错误:指令 subq *25 的操作数无效,%rsp (指令是:subq *25, %rsp

2 --

后端错误:64 位模式不支持 32 位绝对寻址:

movb KeccakPowerOf2(arg2), %al

xorb %al, (arg1)

#define arg1 %rdi

#define arg2 %rsi

KeccakPowerOf2: .byte 1, 2, 4, 8, 16, 32, 64, 128

3 --

后端错误:64 位模式不支持 32 位绝对寻址

leaq KeccakLaneComplementTable, arg5

#define arg5 %r8

`KeccakLaneComplementTable:

.quad   0
.quad   0xFFFFFFFFFFFFFFFF  //  1 be
.quad   0xFFFFFFFFFFFFFFFF  //  2 bi
.quad   0
.quad   0

.quad   0
.quad   0
.quad   0
.quad   0xFFFFFFFFFFFFFFFF  //  8 go
.quad   0

.quad   0
.quad   0
.quad   0xFFFFFFFFFFFFFFFF  // 12 ki
.quad   0
.quad   0

.quad   0
.quad   0
.quad   0xFFFFFFFFFFFFFFFF  // 17 mi
.quad   0
.quad   0

.quad   0xFFFFFFFFFFFFFFFF  // 20 sa
.quad   0
.quad   0
.quad   0
.quad   0`

有什么想法吗?

谢谢

OS X linking / relocation 不支持 32 位绝对寻址。使用相对 RIP。

leaq    KeccakLaneComplementTable(%rip), arg5

对于 2,您可能需要在使用 movb 对其进行索引之前使用单独的指令加载基地址。任何备用寄存器都可以。例如,我将使用 %rax,因为无论如何您都将加载它。如果你能腾出一个寄存器,你可以把lea吊出来,一开始只做一次。

lea     KeccakPowerOf2(%rip), %rax
movb    (%rax,arg2), %al
xorb    %al, (arg1)

或者如果 KeccakLaneComplementTableKeccakPowerOf2 之间的偏移量是固定的,并且该地址永久保留,那么您可以

; if arg5 still has the address of KeccakLaneComplementTable
movb    KeccakPowerOf2 - KeccakLaneComplementTable(arg5, arg2), %al
xorb    %al, (arg1)

KeccakPowerOf2 - KeccakLaneComplementTable 应该是一个 assemble 时间常数,不需要等待 link 时间,所以即使在 OS X 上也是安全的。这个想法是 [KeccakPowerOf2 - KeccakLaneComplementTable + arg5]KeccakPowerOf2,所以 [KeccakPowerOf2 + arg2] 变成 [KeccakPowerOf2 - KeccakLaneComplementTable + arg5 + arg2 ]


对于 1,不知道为什么 subq *25, %rsp 不会 assemble。 assembleGNU binutils 2.25.1 没问题。也许试试 $(8*25)?或者,如果您不能让它工作,只需替换单个数字 0 并在评论中添加 200 = 8*25