0

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

我将 .eq 替换为 #define,将 .global 替换为 .globl,删除 .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`

有任何想法吗 ?

谢谢

4

1 回答 1

0

OS X 链接/重定位不支持 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应该是一个汇编时间常数,并且不必等待链接时间,所以即使在 OS X 上也是安全的。这个想法是[KeccakPowerOf2 - KeccakLaneComplementTable + arg5]KeccakPowerOf2所以[KeccakPowerOf2 + arg2]变成[KeccakPowerOf2 - KeccakLaneComplementTable + arg5 + arg2 ].


1、IDK为什么subq $8*25, %rsp不组装。它可以与 GNU binutils 2.25.1 完美结合。也许试试$(8*25)?或者如果你不能让它工作,只需替换单个数字$200200 = 8*25发表评论。

于 2015-12-26T20:55:19.857 回答