user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<checkQthToCoords>:
  endbr64
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %r8,%rbx
  sub    $0x48,%rsp
  movsd  %xmm0,0x10(%rsp)
  lea    0x28(%rsp),%rdx
  lea    0x20(%rsp),%r8
  movsd  D20(%rip),%xmm0
  movsd  %xmm1,0x18(%rsp)
  movsd  %xmm2,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  addq   $0x1,(%rcx)
  lea    0x30(%rsp),%rcx
  movq   $0x0,0x20(%rsp)
  movsd  %xmm0,0x28(%rsp)
  movsd  %xmm0,0x30(%rsp)
  call   <qth_to_coords@plt>
  test   %rax,%rax
  jne    L52
  cmp    %r13,0x20(%rsp)
  jne    L22
  movsd  0x8(%rsp),%xmm1
  mulsd  D87(%rip),%xmm1
  movsd  0x10(%rsp),%xmm4
  movsd  D113(%rip),%xmm2
  movsd  0x28(%rsp),%xmm3
  movapd %xmm4,%xmm0
  addsd  %xmm1,%xmm0
  addsd  %xmm2,%xmm0
  comisd %xmm0,%xmm3
  ja     L76
  subsd  %xmm1,%xmm4
  movapd %xmm4,%xmm0
  subsd  %xmm2,%xmm0
  comisd %xmm3,%xmm0
  ja     L76
  movsd  0x8(%rsp),%xmm5
  movsd  0x18(%rsp),%xmm6
  movsd  0x30(%rsp),%xmm1
  movapd %xmm5,%xmm0
  addsd  %xmm6,%xmm0
  addsd  %xmm2,%xmm0
  comisd %xmm0,%xmm1
  ja     L94
  subsd  %xmm5,%xmm6
  movapd %xmm6,%xmm0
  subsd  %xmm2,%xmm0
  comisd %xmm1,%xmm0
  ja     L94
  addq   $0x1,(%rbx)
  jmp    L105
  nop
L76:
  lea    D73(%rip),%rdi
  mov    %r12,%rdx
  mov    %rbp,%rsi
  xor    %eax,%eax
  movsd  %xmm1,0x8(%rsp)
  call   <printf@plt>
  mov    D113(%rip),%rax
  movsd  0x8(%rsp),%xmm1
  lea    D36(%rip),%rdi
  movsd  0x28(%rsp),%xmm0
  movq   %rax,%xmm2
  mov    $0x3,%eax
  addsd  %xmm1,%xmm2
  movsd  0x10(%rsp),%xmm1
  call   <printf@plt>
L105:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L17
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L22:
  mov    %r12,%rdx
  mov    %rbp,%rsi
  lea    D73(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x20(%rsp),%rsi
  mov    %r13,%rdx
  xor    %eax,%eax
  lea    D34(%rip),%rdi
  call   <printf@plt>
  jmp    L105
  nopl   0x0(%rax)
L52:
  mov    %r12,%rdx
  mov    %rbp,%rsi
  lea    D73(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D25(%rip),%rdi
  call   <puts@plt>
  jmp    L105
  nopw   0x0(%rax,%rax,1)
L94:
  mov    %r12,%rdx
  mov    %rbp,%rsi
  lea    D73(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    D113(%rip),%rax
  movsd  0x18(%rsp),%xmm1
  lea    D89(%rip),%rdi
  movsd  0x30(%rsp),%xmm0
  movq   %rax,%xmm2
  addsd  0x8(%rsp),%xmm2
  mov    $0x3,%eax
  call   <printf@plt>
  jmp    L105
L17:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D20
type_infered: byte[8]
name: disassemble_data
arguments: label: D87
type_infered: byte[8]
name: disassemble_data
arguments: label: D113
type_infered: f64
name: disassemble_data
arguments: label: D73
type_infered: string
name: disassemble_data
arguments: label: D36
type_infered: string
name: disassemble_data
arguments: label: D34
type_infered: string
name: disassemble_data
arguments: label: D25
type_infered: string
name: disassemble_data
arguments: label: D89
type_infered: string

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

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

tool: D113: 1e-06

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


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


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


tool: D25: 	Invalid test sample.

tool: D89: 	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;
}
```