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

```asm
<proc_gps_input>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x1d8,%rsp
  mov    %edi,%r14d
  mov    %r8,0x10(%rsp)
  mov    %r9,0x18(%rsp)
  mov    0x210(%rsp),%r12
  mov    %fs:0x28,%rax
  mov    %rax,0x1c8(%rsp)
  xor    %eax,%eax
  test   %edi,%edi
  jle    L62
  mov    %rsi,%r13
  mov    %rcx,%rbp
  mov    %edi,%edx
  add    (%rsi),%edx
  mov    $0x0,%r14d
  jmp    L150
L62:
  lea    D56(%rip),%rdi
  call   <perror@plt>
L261:
  mov    0x1c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L202
  mov    %r14d,%eax
  add    $0x1d8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L217:
  lea    0xc0(%rsp),%rax
  mov    %rbp,%rsi
  mov    %rax,(%rsp)
  mov    %rax,%rdi
  call   <strcpy@plt>
  lea    0x40(%rsp),%rsi
  mov    $0xd,%ecx
  lea    D24(%rip),%rdx
  mov    (%rsp),%rdi
  call   <my_split@plt>
  mov    %eax,0xc(%rsp)
  sub    $0xc,%eax
  cmp    $0x1,%eax
  jbe    L194
  lea    0x1(%r14,%r15,1),%r14d
  lea    0x1(%r12,%r15,1),%r12
  jmp    L107
L194:
  lea    0x38(%rsp),%rdi
  call   <compass_get_heading@plt>
  test   %rax,%rax
  jne    L20
  movb   $0x0,0xac(%rsp)
L326:
  lea    0x3c(%rsp),%rdi
  call   <tacho_get_speed@plt>
  test   %rax,%rax
  jne    L264
  movb   $0x0,0xb6(%rsp)
L346:
  mov    0xc(%rsp),%eax
  sub    $0x1,%eax
  cltq
  mov    0x40(%rsp,%rax,8),%rdi
  mov    $0x2a,%esi
  call   <strchr@plt>
  mov    %rax,0x28(%rsp)
  test   %rax,%rax
  je     L205
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x2,%eax
  jg     L48
L205:
  lea    0xac(%rsp),%rax
  mov    %rax,0x80(%rsp)
  cmpb   $0x0,0xb6(%rsp)
  je     L125
  lea    0xb6(%rsp),%rax
  mov    %rax,0x78(%rsp)
L125:
  lea    0x40(%rsp),%r15
  movl   $0x1,(%rsp)
  jmp    L146
L20:
  cvttss2si 0x38(%rsp),%ecx
  lea    0xac(%rsp),%rdi
  lea    D43(%rip),%rdx
  mov    $0xa,%esi
  call   <snprintf@plt>
  jmp    L326
L264:
  cvttss2si 0x3c(%rsp),%ecx
  lea    0xb6(%rsp),%rdi
  lea    D43(%rip),%rdx
  mov    $0xa,%esi
  call   <snprintf@plt>
  jmp    L346
L48:
  mov    0x28(%rsp),%rax
  lea    0x1(%rax),%rdi
  mov    $0x10,%edx
  mov    $0x0,%esi
  call   <strtoul@plt>
  mov    %eax,(%rsp)
  mov    $0x0,%r15d
  jmp    L210
L44:
  mov    0x80(%rsp),%rax
  movsbl (%rax,%r15,1),%eax
  xor    %eax,(%rsp)
  add    $0x1,%r15
L210:
  mov    0x80(%rsp),%rdi
  call   <strlen@plt>
  cmp    %r15d,%eax
  jg     L44
  mov    $0x0,%r15d
  lea    0xac(%rsp),%rax
  mov    %rax,0x20(%rsp)
  jmp    L140
L249:
  mov    0x20(%rsp),%rax
  movsbl (%r15,%rax,1),%eax
  xor    %eax,(%rsp)
  add    $0x1,%r15
L140:
  mov    0x20(%rsp),%rdi
  call   <strlen@plt>
  cmp    %r15d,%eax
  jg     L249
  cmpb   $0x0,0xb6(%rsp)
  jne    L147
L26:
  movzbl (%rsp),%ecx
  lea    0xa9(%rsp),%rdi
  lea    D18(%rip),%rdx
  mov    $0x3,%esi
  call   <snprintf@plt>
  movzbl 0xa9(%rsp),%eax
  mov    0x28(%rsp),%rcx
  mov    %al,0x1(%rcx)
  movzbl 0xaa(%rsp),%eax
  mov    %al,0x2(%rcx)
  jmp    L205
L103:
  mov    0x78(%rsp),%rax
  movsbl (%rax,%r15,1),%eax
  xor    %eax,(%rsp)
  add    $0x1,%r15
L68:
  mov    0x78(%rsp),%rdi
  call   <strlen@plt>
  cmp    %r15d,%eax
  jg     L103
  mov    $0x0,%r15d
  lea    0xb6(%rsp),%rax
  mov    %rax,0x20(%rsp)
  jmp    L180
L147:
  mov    $0x0,%r15d
  jmp    L68
L222:
  mov    0x20(%rsp),%rax
  movsbl (%r15,%rax,1),%eax
  xor    %eax,(%rsp)
  add    $0x1,%r15
L180:
  mov    0x20(%rsp),%rdi
  call   <strlen@plt>
  cmp    %r15d,%eax
  jg     L222
  jmp    L26
L293:
  xorpd  D25(%rip),%xmm1
  jmp    L284
L6:
  movq   %r15,%xmm2
  xorpd  D25(%rip),%xmm2
  movq   %xmm2,%r15
  jmp    L114
L282:
  mov    0x0(%r13),%edx
  sub    %r15d,%edx
L150:
  mov    %edx,0x0(%r13)
  mov    $0xa,%esi
  mov    %rbp,%rdi
  call   <memchr@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L261
  mov    %rbx,%r15
  sub    %rbp,%r15
  lea    0x1(%r15),%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <memcpy@plt>
  movb   $0x0,(%rbx)
  mov    $0x6,%edx
  lea    D16(%rip),%rsi
  mov    %rbp,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L217
  lea    0x1(%r14,%r15,1),%r14d
  lea    0x1(%r12,%r15,1),%r12
L107:
  movb   $0xa,(%rbx)
  lea    0x1(%rbx),%rsi
  mov    %rsi,%r15
  sub    %rbp,%r15
  mov    0x0(%r13),%edx
  cmp    %r15d,%edx
  je     L282
  sub    %r15d,%edx
  mov    %rbp,%rdi
  call   <memmove@plt>
  jmp    L282
L324:
  mov    (%r15),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  mov    (%r15),%rdi
  call   <strlen@plt>
  add    %eax,%r14d
  mov    (%r15),%rdi
  call   <strlen@plt>
  cltq
  add    %rax,%r12
L218:
  addl   $0x1,(%rsp)
  add    $0x8,%r15
L146:
  cmpl   $0x1,(%rsp)
  je     L324
  movb   $0x2c,(%r12)
  add    $0x1,%r14d
  add    $0x1,%r12
  mov    (%r15),%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
  mov    (%r15),%rdi
  call   <strlen@plt>
  add    %eax,%r14d
  mov    (%r15),%rdi
  call   <strlen@plt>
  cltq
  add    %rax,%r12
  mov    (%rsp),%eax
  cmp    %eax,0xc(%rsp)
  jg     L218
  movb   $0xa,(%r12)
  add    $0x1,%r12
  add    $0x1,%r14d
  mov    0x68(%rsp),%rdi
  call   <to_seconds@plt>
  movq   %xmm0,%r15
  mov    0x58(%rsp),%rdi
  call   <to_seconds@plt>
  movapd %xmm0,%xmm1
  mov    0x60(%rsp),%rax
  cmpb   $0x53,(%rax)
  je     L293
L284:
  mov    0x70(%rsp),%rax
  cmpb   $0x57,(%rax)
  je     L6
L114:
  mov    0x18(%rsp),%rdx
  movq   %r15,%xmm0
  mov    0x88(%rsp),%rsi
  mov    0x48(%rsp),%rdi
  mov    0x10(%rsp),%rax
  call   *%rax
  jmp    L107
L202:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D56
type_infered: string
name: disassemble_data
arguments: tag: D24
type_infered: string
name: disassemble_data
arguments: tag: D43
type_infered: string
name: disassemble_data
arguments: tag: D18
type_infered: string
name: disassemble_data
arguments: tag: D25
type_infered: byte[16]
name: disassemble_data
arguments: tag: D16
type_infered: string

tool: D56: proc_gps_input: 

tool: D24: ,

tool: D43: %.1f

tool: D18: %02X

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

tool: D16: $GPRMC

assistant: ```c
int proc_gps_input(int l, int *bufpos, int buflen, char *buf, void (*gpsproc)(char *ptime, char *date, double longg, double latt, void *), void *data, char *writeptr) {
  char *endp;
  int wlen = 0;
  if (l <= 0) {
    perror("proc_gps_input: ");
    return l;
  }
  (*bufpos) += l;
  while ((endp = memchr(buf, '\n', *bufpos))) {
    int readlen;
    memcpy(writeptr, buf, endp - buf + 1);
    *endp = 0;
    if (strncmp(buf, "$GPRMC", 6) == 0) {
      char linebuf[256];
      char *fields[13];
      char headingbuf[10];
      char speedbuf[10];
      strcpy(linebuf, buf);
      int numfields = my_split(linebuf, fields, ",", 13);
      if ((numfields == 12) || (numfields == 13)) {
        double lattsec;
        double longsec;
        float heading;
        float speed;
        if (compass_get_heading(&heading)) {
          snprintf(headingbuf, sizeof(headingbuf), "%.1f", heading);
        } else {
          headingbuf[0] = 0;
        }
        if (tacho_get_speed(&speed)) {
          snprintf(speedbuf, sizeof(speedbuf), "%.1f", speed);
        } else {
          speedbuf[0] = 0;
        }
        if (1) {
          int i;
          int chksum;
          char *chkptr;
          if ((chkptr = strchr(fields[numfields - 1], '*'))) {
            if (strlen(chkptr) > 2) {
              char chkbuf[3];
              chksum = strtoul(chkptr + 1, NULL, 16);
              for (i = 0; i < strlen(fields[8]); i++) {
                chksum ^= (fields[8])[i];
              }
              for (i = 0; i < strlen(headingbuf); i++) {
                chksum ^= headingbuf[i];
              }
              if (speedbuf[0] != 0) {
                for (i = 0; i < strlen(fields[7]); i++) {
                  chksum ^= (fields[7])[i];
                }
                for (i = 0; i < strlen(speedbuf); i++) {
                  chksum ^= speedbuf[i];
                }
              }
              snprintf(chkbuf, sizeof(chkbuf), "%02X", 0xff & (int)chksum);
              chkptr[1] = chkbuf[0];
              chkptr[2] = chkbuf[1];
            }
          }
          fields[8] = headingbuf;
          if (speedbuf[0])
            fields[7] = speedbuf;
          for (i = 0; i < numfields; i++) {
            if (i) {
              writeptr[0] = ',';
              wlen++;
              writeptr++;
            }
            strcpy(writeptr, fields[i]);
            wlen += strlen(fields[i]);
            writeptr += strlen(fields[i]);
          }
          *writeptr = '\n';
          writeptr++;
          wlen++;
        } else {
          wlen += (endp - buf) + 1;
          writeptr += (endp - buf) + 1;
        }
        longsec = to_seconds(fields[5]);
        lattsec = to_seconds(fields[3]);
        if ((fields[4])[0] == 'S')
          lattsec = -lattsec;
        if ((fields[6])[0] == 'W')
          longsec = -longsec;
        gpsproc(fields[1], fields[9], longsec, lattsec, data);
      } else {
        wlen += (endp - buf) + 1;
        writeptr += (endp - buf) + 1;
      }
    } else {
      wlen += (endp - buf) + 1;
      writeptr += (endp - buf) + 1;
    }
    *endp = '\n';
    endp++;
    readlen = endp - buf;
    if (readlen != *bufpos)
      memmove(buf, endp, (*bufpos) - readlen);
    (*bufpos) -= readlen;
  }
  return wlen;
}
```