气苹果语法错误
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)
或者如果 KeccakLaneComplementTable
和 KeccakPowerOf2
之间的偏移量是固定的,并且该地址永久保留,那么您可以
; 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
。
我尝试将此汇编文件: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)
或者如果 KeccakLaneComplementTable
和 KeccakPowerOf2
之间的偏移量是固定的,并且该地址永久保留,那么您可以
; 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
。