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

```asm
<checkQthToCoords>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rdx,%r13
  movq   %xmm0,%r12
  movq   %xmm1,%r14
  movsd  %xmm2,(%rsp)
  mov    %r8,%r15
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  addq   $0x1,(%rcx)
  movq   $0x0,0x10(%rsp)
  movsd  D101(%rip),%xmm0
  movsd  %xmm0,0x18(%rsp)
  movsd  %xmm0,0x20(%rsp)
  lea    0x20(%rsp),%rcx
  lea    0x18(%rsp),%rdx
  lea    0x10(%rsp),%r8
  call   <qth_to_coords@plt>
  test   %rax,%rax
  jne    L18
  cmp    %r13,0x10(%rsp)
  jne    L27
  movsd  (%rsp),%xmm3
  mulsd  D66(%rip),%xmm3
  movsd  %xmm3,0x8(%rsp)
  movsd  0x18(%rsp),%xmm1
  movq   %r12,%xmm0
  addsd  %xmm3,%xmm0
  addsd  D112(%rip),%xmm0
  comisd %xmm0,%xmm1
  ja     L19
  movq   %r12,%xmm0
  subsd  %xmm3,%xmm0
  subsd  D112(%rip),%xmm0
  comisd %xmm1,%xmm0
  ja     L19
  movsd  0x20(%rsp),%xmm1
  movq   %r14,%xmm0
  movsd  (%rsp),%xmm4
  addsd  %xmm4,%xmm0
  addsd  D112(%rip),%xmm0
  comisd %xmm0,%xmm1
  ja     L92
  movq   %r14,%xmm0
  subsd  %xmm4,%xmm0
  subsd  D112(%rip),%xmm0
  comisd %xmm1,%xmm0
  ja     L92
  addq   $0x1,(%r15)
  jmp    L14
L18:
  mov    %rbp,%rdx
  mov    %rbx,%rsi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D43(%rip),%rdi
  call   <puts@plt>
  jmp    L14
L27:
  mov    %rbp,%rdx
  mov    %rbx,%rsi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r13,%rdx
  mov    0x10(%rsp),%rsi
  lea    D135(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L14:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L16
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L19:
  mov    %rbp,%rdx
  mov    %rbx,%rsi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movsd  0x8(%rsp),%xmm2
  addsd  D112(%rip),%xmm2
  movq   %r12,%xmm1
  movsd  0x18(%rsp),%xmm0
  lea    D74(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L14
L92:
  mov    %rbp,%rdx
  mov    %rbx,%rsi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movsd  (%rsp),%xmm2
  addsd  D112(%rip),%xmm2
  movq   %r14,%xmm1
  movsd  0x20(%rsp),%xmm0
  lea    D30(%rip),%rdi
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L14
L16:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_tag: D101
type_guessed: byte[8]
name: unpack_data
arguments: data_tag: D66
type_guessed: byte[8]
name: unpack_data
arguments: data_tag: D112
type_guessed: f64
name: unpack_data
arguments: data_tag: D25
type_guessed: string
name: unpack_data
arguments: data_tag: D43
type_guessed: string
name: unpack_data
arguments: data_tag: D135
type_guessed: string
name: unpack_data
arguments: data_tag: D74
type_guessed: string
name: unpack_data
arguments: data_tag: D30
type_guessed: string

tool: {"D101": [0x00,0x00,0x00,0x00,0x00,0xc0,0x72,0xc0]}

tool: {"D66": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: D112: 1e-06

tool: D25: Test failed: qth_to_coords( "%s", %lu, &lat, &lng, &precision):


tool: D43: 	Invalid test sample.

tool: D135: 	Bad precision, got %lu, expected %lu. 


tool: D74: 	Latitude out of acceptable range: got %f, expected %f +/- %f.


tool: D30: 	Longitude out of acceptable range: got %f, expected %f +/- %f.


assistant: ```c
void checkQthToCoords(const char *qth, size_t qthStringSize, size_t expectedPrecisionLvl, double expectedLat, double expectedLng, double acceptedBias, size_t *takenTests, size_t *passedTests) {
  ++(*takenTests);
  size_t precision = 0;
  double lat = -300;
  double lng = -300;
  if (qth_to_coords(qth, qthStringSize, &lat, &lng, &precision) != 0) {
    printf("Test failed: qth_to_coords( \"%s\", %lu, &lat, &lng, &precision):\n", qth, qthStringSize);
    printf("\tInvalid test sample.\n");
    return;
  }
  if (precision != expectedPrecisionLvl) {
    printf("Test failed: qth_to_coords( \"%s\", %lu, &lat, &lng, &precision):\n", qth, qthStringSize);
    printf("\tBad precision, got %lu, expected %lu. \n", precision, expectedPrecisionLvl);
    return;
  }
  if (lat > (expectedLat + (acceptedBias / 2) + 0.000001) || lat < (expectedLat - (acceptedBias / 2) - 0.000001)) {
    printf("Test failed: qth_to_coords( \"%s\", %lu, &lat, &lng, &precision):\n", qth, qthStringSize);
    printf("\tLatitude out of acceptable range: got %f, expected %f +/- %f.\n", lat, expectedLat, (acceptedBias / 2) + 0.000001);
    return;
  }
  if (lng > (expectedLng + acceptedBias + 0.000001) || lng < (expectedLng - acceptedBias - 0.000001)) {
    printf("Test failed: qth_to_coords( \"%s\", %lu, &lat, &lng, &precision):\n", qth, qthStringSize);
    printf("\tLongitude out of acceptable range: got %f, expected %f +/- %f.\n", lng, expectedLng, acceptedBias + 0.000001);
    return;
  }
  ++(*passedTests);
  return;
}
```