Gas apple语法错误

时间:2015-12-26 20:02:56

标签: macos assembly gas keccak

我尝试将此程序集文件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`

有什么想法吗?

谢谢

1 个答案:

答案 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)

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

; 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放入评论中。