user: 请从给定的汇编指令推导出C源代码:

```asm
<inet_aton_>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x1,-0x28(%rbp)
  movl   $0x0,-0x30(%rbp)
  movl   $0x0,-0x2c(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x24(%rbp)
  movl   $0x0,-0x20(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L48
L85:
  mov    -0x34(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L173
  addl   $0x1,-0x30(%rbp)
  cmpl   $0x3,-0x30(%rbp)
  jle    L191
  movl   $0x0,-0x28(%rbp)
  jmp    L112
L191:
  mov    -0x30(%rbp),%eax
  cltq
  movl   $0x0,-0x20(%rbp,%rax,4)
  jmp    L76
L173:
  mov    -0x34(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L131
  mov    -0x34(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L131
  mov    -0x30(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%eax
  cltq
  mov    %edx,-0x20(%rbp,%rax,4)
  mov    -0x30(%rbp),%eax
  cltq
  mov    -0x20(%rbp,%rax,4),%edx
  mov    -0x34(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x48(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %eax,%edx
  mov    -0x30(%rbp),%eax
  cltq
  mov    %edx,-0x20(%rbp,%rax,4)
  jmp    L76
L131:
  movl   $0x0,-0x28(%rbp)
L76:
  addl   $0x1,-0x34(%rbp)
L48:
  mov    -0x34(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jl     L85
L112:
  cmpl   $0x3,-0x30(%rbp)
  je     L111
  cmpl   $0x3,-0x30(%rbp)
  jg     L156
  cmpl   $0x2,-0x30(%rbp)
  je     L89
  cmpl   $0x2,-0x30(%rbp)
  jg     L156
  cmpl   $0x0,-0x30(%rbp)
  je     L31
  cmpl   $0x1,-0x30(%rbp)
  je     L180
  jmp    L156
L111:
  mov    -0x20(%rbp),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  shl    $0x10,%eax
  and    $0xff0000,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%eax
  shl    $0x8,%eax
  movzwl %ax,%eax
  or     %eax,%edx
  mov    -0x14(%rbp),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x2c(%rbp)
  jmp    L156
L89:
  mov    -0x20(%rbp),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  shl    $0x10,%eax
  and    $0xff0000,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%eax
  movzwl %ax,%eax
  or     %edx,%eax
  mov    %eax,-0x2c(%rbp)
  jmp    L156
L180:
  mov    -0x20(%rbp),%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  and    $0xffffff,%eax
  or     %edx,%eax
  mov    %eax,-0x2c(%rbp)
  jmp    L156
L31:
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  nop
L156:
  mov    -0x50(%rbp),%rax
  mov    -0x2c(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L69
  call   <__stack_chk_fail@plt>
L69:
  leave
  ret
```

assistant: ```c
int inet_aton_(char *s, int *retval) {
  int i, l, x, el[4], ret, good = 1;
  x = 0, ret = 0;
  l = strlen(s);
  el[0] = 0;
  for (i = 0; i < l; i++) {
    if (s[i] == '.') {
      x++;
      if (x > 3) {
        good = 0;
        break;
      }
      el[x] = 0;
    } else if (s[i] >= '0' && s[i] <= '9') {
      el[x] *= 10;
      el[x] += s[i] - '0';
    } else
      good = 0;
  }
  switch (x) {
  case 3:
    ret = (((el[0] << 24) & 0xff000000) | ((el[1] << 16) & 0x00ff0000) | ((el[2] << 8) & 0x0000ff00) | (el[3] & 0x000000ff));
    break;
  case 2:
    ret = (((el[0] << 24) & 0xff000000) | ((el[1] << 16) & 0x00ff0000) | (el[2] & 0x0000ffff));
    break;
  case 1:
    ret = (((el[0] << 24) & 0xff000000) | (el[1] & 0x00ffffff));
    break;
  case 0:
    ret = el[0];
    break;
  }
  *retval = ret;
  return good;
}
```