RE4B Challenge 6

2017-10-21

Challenge

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

Reslove

  • jmp X: absolute jump, rip = X
  • nop X: multi-byte NOP, do nothing
  • movzx: move with zero-extension
  • movsx: move with sign-extension

  • arg1: pointer
  • arg2: pointer

将单字节扩展为双字节,带符号

void f(char *a1, char *a2){
    char tmp;
    i = 0;
    k = 0;
    
    do{
        tmp = a1[i];
        
        if(tmp >= 0){
            a2[i] = 0;
        }else{
            a2[i] = -1;
        }
    
        a2[i+1] = tmp;

        i += 1;
        k += 2;
    }while(tmp != '\0');
}

PS1: 汇编代码的优化很好,使用C编写后反而很不优雅。 PS2: 不要在意参数的类型。这里的代码仅仅是体现了一下逻辑,和汇编不完全等价。