Search code examples
macosassemblygnu-assemblerkeccak

Gas apple syntax error


I try to convert this assembly file : https://github.com/gvanas/KeccakCodePackage/blob/master/SnP/KeccakF-1600/OptimizedAsmX86-64/KeccakF-1600-x86-64-gas.s into apple syntax. (old syntax)

I replace .eq by #define, .global by .globl, remove .type, .size.

There is some errors again (i use clang) :

1 --

error: invalid operand for instruction subq *25, %rsp (the instruction is : subq $8*25, %rsp )

2 --

error in backend: 32-bit absolute addressing is not supported in 64-bit mode :

movb KeccakPowerOf2(arg2), %al

xorb %al, (arg1)

with

#define arg1 %rdi

#define arg2 %rsi

and

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

3 --

error in backend: 32-bit absolute addressing is not supported in 64-bit mode

leaq KeccakLaneComplementTable, arg5

with

#define arg5 %r8

and

`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`

Any ideas ?

Thank you


Solution

  • OS X linking / relocation doesn't support 32bit absolute addressing. Use RIP relative.

    leaq    KeccakLaneComplementTable(%rip), arg5
    

    For 2, you probably need to load the base address with a separate instruction, before you index it with movb. Any spare register will do. I'll use %rax for example, since you're about to load into it anyway. If you can spare a register, you can hoist the lea out and do it only once at the start.

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

    Or if the offset between KeccakLaneComplementTable and KeccakPowerOf2 is fixed, and that address is kept around permanently, then you can do

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

    KeccakPowerOf2 - KeccakLaneComplementTable should be an assemble-time constant, and doesn't have to wait for link-time, so it's safe even on OS X. The idea is that [KeccakPowerOf2 - KeccakLaneComplementTable + arg5] is KeccakPowerOf2, so [KeccakPowerOf2 + arg2] becomes [KeccakPowerOf2 - KeccakLaneComplementTable + arg5 + arg2 ].


    For 1, IDK why subq $8*25, %rsp wouldn't assemble. It assembles fine with GNU binutils 2.25.1. Maybe try $(8*25)? Or if you can't get that to work, just substitute the single number $200 and put 200 = 8*25 in a comment.