user: 下面的汇编指令对应的C源代码是什么：

```asm
<swh_geoc2d>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x58(%rbp),%rdx
  lea    -0x24(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  lea    -0x38(%rbp),%rdx
  lea    -0x24(%rbp),%rax
  lea    D31(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L194
  mov    -0x30(%rbp),%rax
  lea    D145(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strspn@plt>
  mov    %rax,%rbx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,%rbx
  je     L129
L194:
  mov    $0xffffffff,%eax
  jmp    L49
L129:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x44(%rbp)
  mov    -0x44(%rbp),%eax
  not    %eax
  shr    $0x1f,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x38(%rbp),%rax
  mov    %rax,%rdx
  lea    D31(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L287
  mov    $0xffffffff,%eax
  jmp    L49
L287:
  mov    -0x30(%rbp),%rax
  lea    D27(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L230
  mov    -0x30(%rbp),%rax
  lea    D83(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L86
L230:
  movl   $0x5a,-0x48(%rbp)
  movl   $0x1,-0x4c(%rbp)
  jmp    L171
L86:
  mov    -0x30(%rbp),%rax
  lea    D107(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L257
  mov    -0x30(%rbp),%rax
  lea    D78(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L54
L257:
  movl   $0xb4,-0x48(%rbp)
  movl   $0x0,-0x4c(%rbp)
  jmp    L171
L54:
  mov    $0xffffffff,%eax
  jmp    L49
L171:
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  setle  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x38(%rbp),%rax
  mov    %rax,%rdx
  lea    D31(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L218
  mov    -0x30(%rbp),%rax
  lea    D145(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strspn@plt>
  mov    %rax,%rbx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,%rbx
  je     L106
L218:
  mov    $0xffffffff,%eax
  jmp    L49
L106:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x40(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jne    L157
  cmpl   $0x0,-0x40(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L288
L157:
  cmpl   $0x0,-0x40(%rbp)
  js     L208
  cmpl   $0x3b,-0x40(%rbp)
  jg     L208
  mov    $0x1,%eax
  jmp    L288
L208:
  mov    $0x0,%eax
L288:
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x38(%rbp),%rax
  mov    %rax,%rdx
  lea    D31(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok_r@plt>
  mov    %rax,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L261
  mov    -0x30(%rbp),%rax
  lea    D145(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strspn@plt>
  mov    %rax,%rbx
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    %rax,%rbx
  je     L180
L261:
  mov    $0xffffffff,%eax
  jmp    L49
L180:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x3c(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jne    L305
  cmpl   $0x0,-0x3c(%rbp)
  sete   %al
  movzbl %al,%eax
  jmp    L96
L305:
  cmpl   $0x0,-0x3c(%rbp)
  js     L216
  cmpl   $0x3b,-0x3c(%rbp)
  jg     L216
  mov    $0x1,%eax
  jmp    L96
L216:
  mov    $0x0,%eax
L96:
  mov    %eax,%edi
  call   <assert@plt>
  cmpl   $0x0,-0x4c(%rbp)
  je     L13
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x44(%rbp),%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x40(%rbp),%xmm2
  movsd  D32(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x3c(%rbp),%xmm2
  movsd  D155(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  jmp    L211
L13:
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x44(%rbp),%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x40(%rbp),%xmm2
  movsd  D32(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtsi2sdl -0x3c(%rbp),%xmm2
  movsd  D155(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movq   D106(%rip),%xmm1
  xorpd  %xmm1,%xmm0
L211:
  mov    -0x60(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    $0x0,%eax
L49:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L297
  call   <__stack_chk_fail@plt>
L297:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D31
datatype: string
name: unpack_data
arguments: label: D145
datatype: string
name: unpack_data
arguments: label: D27
datatype: string
name: unpack_data
arguments: label: D83
datatype: string
name: unpack_data
arguments: label: D107
datatype: string
name: unpack_data
arguments: label: D78
datatype: string
name: unpack_data
arguments: label: D32
datatype: byte[8]
name: unpack_data
arguments: label: D155
datatype: byte[8]
name: unpack_data
arguments: label: D106
datatype: byte[8]

tool: D31: :

tool: D145: 0123456789

tool: D27: N

tool: D83: E

tool: D107: S

tool: D78: W

tool: {"D32": [0x11,0x11,0x11,0x11,0x11,0x11,0x91,0x3f]}

tool: {"D155": [0xdf,0xbc,0x9a,0x78,0x56,0x34,0x32,0x3f]}

tool: {"D106": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80]}

assistant: ```c
int swh_geoc2d(const char *coord, double *ret) {
  int deg, dir, min, sec, degmax;
  char *ptr, buf[12];
  strcpy(buf, coord);
  char *saveptr;
  ptr = strtok_r(buf, ":", &saveptr);
  if (ptr == NULL || strspn(ptr, "0123456789") != strlen(ptr))
    return -1;
  else
    deg = atoi(ptr);
  assert(deg >= 0);
  ptr = strtok_r(NULL, ":", &saveptr);
  if (ptr == NULL)
    return -1;
  else {
    if (strcmp(ptr, "N") == 0 || strcmp(ptr, "E") == 0) {
      degmax = 90;
      dir = 1;
    } else if (strcmp(ptr, "S") == 0 || strcmp(ptr, "W") == 0) {
      degmax = 180;
      dir = 0;
    } else
      return -1;
  }
  assert(deg <= degmax);
  ptr = strtok_r(NULL, ":", &saveptr);
  if (ptr == NULL || strspn(ptr, "0123456789") != strlen(ptr))
    return -1;
  else
    min = atoi(ptr);
  assert(deg == degmax ? min == 0 : min >= 0 && min <= 59);
  ptr = strtok_r(NULL, ":", &saveptr);
  if (ptr == NULL || strspn(ptr, "0123456789") != strlen(ptr))
    return -1;
  else
    sec = atoi(ptr);
  assert(deg == degmax ? sec == 0 : sec >= 0 && sec <= 59);
  *ret = (double)(dir ? (deg + ((1.0 / 60) * min) + ((1.0 / 3600) * sec)) : -(deg + ((1.0 / 60) * min) + ((1.0 / 3600) * sec)));
  return 0;
}
```