Reverse Engineering challenge #6.

Tags: ARM MIPS ARM64 X64 ASM L1 .

What does this code do? This is one of the simplest exercises I made, but still this code can be served as useful library function and is certainly used in many modern real-world applications.

Non-optimizing GCC 4.8.2:


<f>:
   0:             push   rbp
   1:             mov    rbp,rsp
   4:             mov    QWORD PTR [rbp-0x8],rdi
   8:             mov    QWORD PTR [rbp-0x10],rsi
   c:             mov    rax,QWORD PTR [rbp-0x8]
  10:             movzx  eax,BYTE PTR [rax]
  13:             movsx  dx,al
  17:             mov    rax,QWORD PTR [rbp-0x10]
  1b:             mov    WORD PTR [rax],dx
  1e:             mov    rax,QWORD PTR [rbp-0x10]
  22:             movzx  eax,WORD PTR [rax]
  25:             test   ax,ax
  28:             jne    2c 
  2a:             jmp    38 
  2c:             add    QWORD PTR [rbp-0x8],0x1
  31:             add    QWORD PTR [rbp-0x10],0x2
  36:             jmp    c 
  38:             pop    rbp
  39:             ret

Optimizing GCC 4.8.2:


<f>:
   0:          jmp    10 
   2:          nop    WORD PTR [rax+rax*1+0x0]
   8:          add    rdi,0x1
   c:          add    rsi,0x2
  10:          movsx  ax,BYTE PTR [rdi]
  14:          test   ax,ax
  17:          mov    WORD PTR [rsi],ax
  1a:          jne    8 
  1c:          repz ret
  1e:          xchg   ax,ax

Optimizing GCC 4.9.3 for ARM64:


<f>:
0:           ldrb    w2, [x0]
4:           strh    w2, [x1]
8:           cbz     w2, 18 
c:           ldrb    w2, [x0,#1]!
10:          strh    w2, [x1,#2]!
14:          cbnz    w2, c 
18:          ret

(ARM) Optimizing Keil 5.05 (ARM mode):


f PROC
|L0.0|
        LDRB     r2,[r0,#0]
        CMP      r2,#0
        STRH     r2,[r1,#0]
        BEQ      |L0.14|
        ADDS     r0,r0,#1
        ADDS     r1,r1,#2
        B        |L0.0|
|L0.14|
        BX       lr
        ENDP

(ARM) Optimizing Keil 5.05 (Thumb mode):


f PROC
|L0.0|
        LDRB     r2,[r0,#0]
        CMP      r2,#0
        STRH     r2,[r1,#0]
        ADDNE    r0,r0,#1
        ADDNE    r1,r1,#2
        BNE      |L0.0|
        BX       lr
        ENDP

Optimizing GCC 4.4.5 for MIPS:


f:
        lb      $2,0($4)
        nop
        andi    $2,$2,0xffff
        beq     $2,$0,$L8
        sh      $2,0($5)

$L5:
        addiu   $4,$4,1
        lb      $2,0($4)
        addiu   $5,$5,2
        andi    $2,$2,0xffff
        bne     $2,$0,$L5
        sh      $2,0($5)
$L8:
        j       $31
        nop

More challenges: challenges.re; about solutions: challenges.re/#Solutions.