user: 这段汇编代码用C语言表示是什么样的:

```asm
<loc_aton>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x68(%rbp)
  movl   $0x0,-0x64(%rbp)
  movl   $0x0,-0x54(%rbp)
  movl   $0x0,-0x50(%rbp)
  movl   $0x0,-0x4c(%rbp)
  movl   $0x0,-0x60(%rbp)
  movl   $0x0,-0x5c(%rbp)
  movl   $0x1,-0x58(%rbp)
  movq   $0x16,-0x40(%rbp)
  movq   $0x13,-0x38(%rbp)
  movq   $0x12,-0x30(%rbp)
  movl   $0x0,-0x70(%rbp)
  movl   $0x0,-0x6c(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rbx
  mov    -0x78(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cltq
  add    %rbx,%rax
  mov    %rax,-0x28(%rbp)
  lea    -0x70(%rbp),%rdx
  lea    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <latlon2ul@plt>
  mov    %eax,-0x50(%rbp)
  lea    -0x6c(%rbp),%rdx
  lea    -0x48(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <latlon2ul@plt>
  mov    %eax,-0x4c(%rbp)
  mov    -0x70(%rbp),%edx
  mov    -0x6c(%rbp),%eax
  add    %edx,%eax
  cmp    $0x3,%eax
  jne    L168
  mov    -0x70(%rbp),%eax
  cmp    $0x1,%eax
  jne    L291
  mov    -0x6c(%rbp),%eax
  cmp    $0x2,%eax
  jne    L291
  mov    -0x50(%rbp),%eax
  mov    %eax,-0x68(%rbp)
  mov    -0x4c(%rbp),%eax
  mov    %eax,-0x64(%rbp)
  jmp    L246
L291:
  mov    -0x70(%rbp),%eax
  cmp    $0x2,%eax
  jne    L237
  mov    -0x6c(%rbp),%eax
  cmp    $0x1,%eax
  jne    L237
  mov    -0x50(%rbp),%eax
  mov    %eax,-0x64(%rbp)
  mov    -0x4c(%rbp),%eax
  mov    %eax,-0x68(%rbp)
  jmp    L246
L237:
  mov    $0x0,%eax
  jmp    L294
L246:
  nop
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  jne    L64
  jmp    L363
L168:
  mov    $0x0,%eax
  jmp    L294
L363:
  movl   $0xffffffff,-0x58(%rbp)
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L64:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2b,%al
  jne    L14
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
  jmp    L14
L150:
  mov    -0x60(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%ecx
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %ecx,%eax
  mov    %eax,-0x60(%rbp)
L14:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L150
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L175
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L175
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x30(%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L175
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %eax,-0x5c(%rbp)
L175:
  mov    -0x60(%rbp),%eax
  imul   $0x64,%eax,%edx
  mov    -0x5c(%rbp),%eax
  add    %edx,%eax
  imul   -0x58(%rbp),%eax
  add    $0x989680,%eax
  mov    %eax,-0x54(%rbp)
  jmp    L42
L62:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L42:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L149
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L62
  jmp    L149
L384:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L149:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L306
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L384
L306:
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  jbe    L4
  lea    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <precsize_aton@plt>
  mov    %rax,-0x30(%rbp)
  jmp    L118
L379:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L118:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L248
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L379
  jmp    L248
L34:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L248:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L283
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L34
L283:
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  jbe    L356
  lea    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <precsize_aton@plt>
  mov    %rax,-0x40(%rbp)
  jmp    L49
L322:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L49:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L203
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L322
  jmp    L203
L194:
  mov    -0x48(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x48(%rbp)
L203:
  mov    -0x48(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L25
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  ja     L194
L25:
  mov    -0x48(%rbp),%rax
  cmp    %rax,-0x28(%rbp)
  jbe    L55
  lea    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <precsize_aton@plt>
  mov    %rax,-0x38(%rbp)
  jmp    L290
L4:
  nop
  jmp    L290
L356:
  nop
  jmp    L290
L55:
  nop
L290:
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movl   $0x0,(%rax)
  mov    -0x30(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x40(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x20(%rbp),%rdx
  mov    -0x68(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <PUTLONG@plt>
  mov    -0x20(%rbp),%rdx
  mov    -0x64(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <PUTLONG@plt>
  mov    -0x20(%rbp),%rdx
  mov    -0x54(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <PUTLONG@plt>
  mov    $0x10,%eax
L294:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L359
  call   <__stack_chk_fail@plt>
L359:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int loc_aton(const char *ascii, u_char *binary) {
  const char *cp, *maxcp;
  u_char *bcp;
  u_int32_t latit = 0, longit = 0, alt = 0;
  u_int32_t lltemp1 = 0, lltemp2 = 0;
  int altmeters = 0, altfrac = 0, altsign = 1;
  u_int8_t hp = 0x16;
  u_int8_t vp = 0x13;
  u_int8_t siz = 0x12;
  int which1 = 0, which2 = 0;
  cp = ascii;
  maxcp = cp + strlen(ascii);
  lltemp1 = latlon2ul((char **)&cp, &which1);
  lltemp2 = latlon2ul((char **)&cp, &which2);
  switch (which1 + which2) {
  case 3:
    if ((which1 == 1) && (which2 == 2)) {
      latit = lltemp1;
      longit = lltemp2;
    } else if ((which1 == 2) && (which2 == 1)) {
      longit = lltemp1;
      latit = lltemp2;
    } else {
      return (0);
    }
    break;
  default:
    return (0);
  }
  if (*cp == '-') {
    altsign = -1;
    cp++;
  }
  if (*cp == '+')
    cp++;
  while (isdigit((unsigned char)*cp))
    altmeters = altmeters * 10 + (*cp++ - '0');
  if (*cp == '.') {
    cp++;
    if (isdigit((unsigned char)*cp)) {
      altfrac = (*cp++ - '0') * 10;
      if (isdigit((unsigned char)*cp)) {
        altfrac += (*cp++ - '0');
      }
    }
  }
  alt = (10000000 + (altsign * (altmeters * 100 + altfrac)));
  while (!isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  while (isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  if (cp >= maxcp)
    goto defaults;
  siz = precsize_aton(&cp);
  while (!isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  while (isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  if (cp >= maxcp)
    goto defaults;
  hp = precsize_aton(&cp);
  while (!isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  while (isspace((unsigned char)*cp) && (cp < maxcp))
    cp++;
  if (cp >= maxcp)
    goto defaults;
  vp = precsize_aton(&cp);
defaults:
  bcp = binary;
  *bcp++ = (u_int8_t)0;
  *bcp++ = siz;
  *bcp++ = hp;
  *bcp++ = vp;
  PUTLONG(latit, bcp);
  PUTLONG(longit, bcp);
  PUTLONG(alt, bcp);
  return (16);
}
```