user: 请将以下的汇编代码转换成C语言代码:

```asm
<str_len_07>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  movq   $0x0,-0x18(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L180
L49:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L136
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  jmp    L88
L136:
  addq   $0x1,-0x10(%rbp)
L180:
  mov    -0x10(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  jne    L49
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  add    %rax,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L117:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movabs $0xfefefefefefefeff,%rdx
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  not    %rax
  and    %rax,%rdx
  movabs $0x8080808080808080,%rax
  and    %rdx,%rax
  test   %rax,%rax
  jne    L63
  addq   $0x8,-0x18(%rbp)
  jmp    L178
L63:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movzbl %al,%eax
  test   %rax,%rax
  je     L79
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  and    $0xff00,%eax
  test   %rax,%rax
  jne    L5
  addq   $0x1,-0x18(%rbp)
  jmp    L4
L5:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  and    $0xff0000,%eax
  test   %rax,%rax
  jne    L176
  addq   $0x2,-0x18(%rbp)
  jmp    L4
L176:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  and    $0xff000000,%eax
  test   %rax,%rax
  jne    L58
  addq   $0x3,-0x18(%rbp)
  jmp    L4
L58:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movabs $0xff00000000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  jne    L16
  addq   $0x4,-0x18(%rbp)
  jmp    L4
L16:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movabs $0xff0000000000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  jne    L92
  addq   $0x5,-0x18(%rbp)
  jmp    L4
L92:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movabs $0xff000000000000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  jne    L7
  addq   $0x6,-0x18(%rbp)
  jmp    L4
L7:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%rax
  movabs $0xff00000000000000,%rdx
  and    %rdx,%rax
  test   %rax,%rax
  jne    L163
  addq   $0x7,-0x18(%rbp)
  jmp    L4
L163:
  addq   $0x8,-0x18(%rbp)
L178:
  addq   $0x8,-0x8(%rbp)
  jmp    L117
L79:
  nop
L4:
  mov    -0x18(%rbp),%rax
L88:
  pop    %rbp
  ret
```

assistant: ```c
size_t str_len_07(const char *s) {
  size_t len = 0;
  const char *tmp;
  for (tmp = s; ((unsigned long)(tmp) & (15)) != 0; ++tmp) {
    if (!(*tmp)) {
      return tmp - s;
    }
  }
  len += (tmp - s);
  unsigned long long *a = (unsigned long long *)tmp;
  for (;; ++a) {
    if (!((*a - 0x0101010101010101) & ~*a & 0x8080808080808080)) {
      len += 8;
      continue;
    }
    if (!((*a) & (0x00000000000000ff))) {
      break;
    }
    if (!((*a) & (0x000000000000ff00))) {
      len += 1;
      break;
    }
    if (!((*a) & (0x0000000000ff0000))) {
      len += 2;
      break;
    }
    if (!((*a) & (0x00000000ff000000))) {
      len += 3;
      break;
    }
    if (!((*a) & (0x000000ff00000000))) {
      len += 4;
      break;
    }
    if (!((*a) & (0x0000ff0000000000))) {
      len += 5;
      break;
    }
    if (!((*a) & (0x00ff000000000000))) {
      len += 6;
      break;
    }
    if (!((*a) & (0xff00000000000000))) {
      len += 7;
      break;
    }
    len += 8;
  }
  return len;
}
```