逆向-beginners之循环while

#include

int my_strlen(const char * str)
{
    const char *eos = str;

    while (*eos++);

    return (eos - str - 1);
}

int main()
{
    return my_strlen("xiaozhi");
}

#if 0

mov eax, dword ptr _str$[ebp]    ; 将指针指向字符串
mov dword ptr _eos[ebp], eax    ; 指向局部变量eos
mov ecx, dword ptr _eos$[ebp]    ; ECX=eos

movsx edx, byte ptr [ecx]        
mov eax, dword ptr eos$[ebp]    ; eax = eos
add eax, 1                        ; eax++
mov dword ptr _eos$[ebp], eax    ; eax 还原为 eos
test edx, edx                    ; edx == 0 ?


movsx , mov with sign-extend。在把小空间数据转换为大空间数据时,存在填充高位数据的问题。如将原始数据的8位数据填写充EDX的低8位:原始数据是负数,该指令将使用1填充第8到第31位(高24),否则使用0填充高24位。

/* GCC */

not ecx

not对操作数的所有位(bit)都进行非运算。和xor ecx, 0xffffffff等价。 not ecx 的结果与某数相加,相当于某数减去ECX和1。

在程度开始的时候,ECX保存了字符串首个字符的地址(指针),EAX存储的是终止符的地址。对ECX求非,再与EAX相加,就是在计算EAX-ECX-1的值。这种运算可以得到正确的字符串长度。

#endif

#if 0
/*
 * intel
 */
0000000000001129 :
    1129:    f3 0f 1e fa              endbr64
    112d:    55                       push   %rbp
    112e:    48 89 e5                 mov    %rsp,%rbp
    1131:    48 89 7d e8              mov    %rdi,-0x18(%rbp)
    1135:    48 8b 45 e8              mov    -0x18(%rbp),%rax
    1139:    48 89 45 f8              mov    %rax,-0x8(%rbp)
    113d:    90                       nop
    113e:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1142:    48 8d 50 01              lea    0x1(%rax),%rdx
    1146:    48 89 55 f8              mov    %rdx,-0x8(%rbp)
    114a:    0f b6 00                 movzbl (%rax),%eax
    114d:    84 c0                    test   %al,%al
    114f:    75 ed                    jne    113e
    1151:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1155:    48 2b 45 e8              sub    -0x18(%rbp),%rax
    1159:    83 e8 01                 sub    $0x1,%eax
    115c:    5d                       pop    %rbp
    115d:    c3                       retq   

000000000000115e

:
    115e:    f3 0f 1e fa              endbr64
    1162:    55                       push   %rbp
    1163:    48 89 e5                 mov    %rsp,%rbp
    1166:    48 8d 3d 97 0e 00 00     lea    0xe97(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    116d:    e8 b7 ff ff ff           callq  1129
    1172:    5d                       pop    %rbp
    1173:    c3                       retq   
    1174:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
    117b:    00 00 00
    117e:    66 90                    xchg   %ax,%ax

/*
 * arm
 */
000000000040051c :
  40051c:    d10083ff     sub    sp, sp, #0x20
  400520:    f90007e0     str    x0, [sp, #8]
  400524:    f94007e0     ldr    x0, [sp, #8]
  400528:    f9000fe0     str    x0, [sp, #24]
  40052c:    d503201f     nop
  400530:    f9400fe0     ldr    x0, [sp, #24]
  400534:    91000401     add    x1, x0, #0x1
  400538:    f9000fe1     str    x1, [sp, #24]
  40053c:    39400000     ldrb    w0, [x0]
  400540:    7100001f     cmp    w0, #0x0
  400544:    54ffff61     b.ne    400530   // b.any
  400548:    f9400fe1     ldr    x1, [sp, #24]
  40054c:    f94007e0     ldr    x0, [sp, #8]
  400550:    cb000020     sub    x0, x1, x0
  400554:    51000400     sub    w0, w0, #0x1
  400558:    910083ff     add    sp, sp, #0x20
  40055c:    d65f03c0     ret

0000000000400560

:
  400560:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400564:    910003fd     mov    x29, sp
  400568:    90000000     adrp    x0, 400000 <_init-0x3b0>
  40056c:    9118c000     add    x0, x0, #0x630
  400570:    97ffffeb     bl    40051c
  400574:    a8c17bfd     ldp    x29, x30, [sp], #16
  400578:    d65f03c0     ret
  40057c:    00000000     .inst    0x00000000 ; undefined


#endif

你可能感兴趣的:(Assembly,汇编)