我尝试将此程序集文件https://github.com/gvanas/KeccakCodePackage/blob/master/SnP/KeccakF-1600/OptimizedAsmX86-64/KeccakF-1600-x86-64-gas.s转换为apple语法。 (旧语法)
我用#define替换.eq,.globl替换.global,删除.type,.size。
再次出现一些错误(我使用clang):
1 -
错误:指令subq * 25,%rsp的无效操作数
(说明是:subq $8*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`
有什么想法吗?
谢谢
答案 0 :(得分:0)
OS X链接/重定位不支持32位绝对寻址。使用RIP relative。
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
应该是一个汇编时常数,并且不必等待链接时间,所以即使在OS X上它也是安全的。这个想法是{{1} } [KeccakPowerOf2 - KeccakLaneComplementTable + arg5]
,KeccakPowerOf2
变为[KeccakPowerOf2 + arg2]
。
对于 1 ,IDK为什么[KeccakPowerOf2 - KeccakLaneComplementTable + arg5 + arg2 ]
无法汇编。它与GNU binutils 2.25.1组合得很好。也许试试subq $8*25, %rsp
?或者,如果您无法使其发挥作用,只需替换单个号码$(8*25)
并将$200
放入评论中。