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

```asm
<ReadBearing>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movb   $0x0,-0x20(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x34(%rbp)
  movl   $0x0,-0x3c(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L159
L31:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L102
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  jne    L57
L102:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L41
  mov    -0x3c(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L41
  cmpl   $0x0,-0x38(%rbp)
  je     L41
L57:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x38(%rbp),%eax
  cltq
  mov    %dl,-0x20(%rbp,%rax,1)
  addl   $0x1,-0x38(%rbp)
L41:
  addl   $0x1,-0x3c(%rbp)
L159:
  mov    -0x3c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jge    L104
  cmpl   $0x11,-0x3c(%rbp)
  jle    L31
L104:
  mov    -0x38(%rbp),%eax
  cltq
  movb   $0x0,-0x20(%rbp,%rax,1)
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x34(%rbp)
  movl   $0x0,-0x3c(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L46
L146:
  mov    -0x3c(%rbp),%eax
  cltq
  movzbl -0x20(%rbp,%rax,1),%eax
  cmp    $0x20,%al
  jne    L112
  addl   $0x1,-0x38(%rbp)
L112:
  addl   $0x1,-0x3c(%rbp)
L46:
  mov    -0x3c(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L146
  cmpl   $0x0,-0x38(%rbp)
  jne    L119
  lea    -0x30(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  lea    D2(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
L119:
  cmpl   $0x2,-0x38(%rbp)
  jne    L51
  lea    -0x28(%rbp),%rsi
  lea    -0x40(%rbp),%rcx
  lea    -0x44(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  mov    %rsi,%r8
  lea    D32(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  mov    -0x44(%rbp),%eax
  test   %eax,%eax
  jns    L56
  mov    -0x40(%rbp),%eax
  neg    %eax
  mov    %eax,-0x40(%rbp)
  movsd  -0x28(%rbp),%xmm0
  movq   D60(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
L56:
  mov    -0x44(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mov    -0x40(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  D9(%rip),%xmm2
  divsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  movsd  D5(%rip),%xmm2
  divsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
L51:
  movsd  -0x30(%rbp),%xmm0
  comisd D14(%rip),%xmm0
  ja     L6
  movsd  -0x30(%rbp),%xmm1
  movsd  D56(%rip),%xmm0
  comisd %xmm1,%xmm0
  jbe    L84
L6:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x30(%rbp)
L84:
  movsd  -0x30(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L169
  call   <__stack_chk_fail@plt>
L169:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D2
type_guessed: string
name: disassemble_data
arguments: label: D32
type_guessed: string
name: disassemble_data
arguments: label: D60
type_guessed: f32[2]
name: disassemble_data
arguments: label: D9
type_guessed: f32[2]
name: disassemble_data
arguments: label: D5
type_guessed: f32[2]
name: disassemble_data
arguments: label: D14
type_guessed: f64[2]
name: disassemble_data
arguments: label: D56
type_guessed: f32[2]

tool: D2: %lf

tool: D32: %d %d %lf

tool: {"D60": [0.0,-0.0]}

tool: {"D9": [0.0,3.21875]}

tool: {"D5": [0.0,5.37890625]}

tool: {"D14": [360.0,-360.0]}

tool: {"D56": [0.0,-3.8515625]}

assistant: ```c
double ReadBearing(input)
char *input;
{
  char string[20];
  double bearing = 0.0, seconds;
  int a, b, length, degrees, minutes;
  string[0] = 0;
  length = strlen(input);
  for (a = 0, b = 0; a < length && a < 18; a++) {
    if ((input[a] != 32 && input[a] != '\n') || (input[a] == 32 && input[a + 1] != 32 && b != 0)) {
      string[b] = input[a];
      b++;
    }
  }
  string[b] = 0;
  length = strlen(string);
  for (a = 0, b = 0; a < length; a++)
    if (string[a] == 32)
      b++;
  if (b == 0)
    sscanf(string, "%lf", &bearing);
  if (b == 2) {
    sscanf(string, "%d %d %lf", &degrees, &minutes, &seconds);
    if (degrees < 0.0) {
      minutes = -minutes;
      seconds = -seconds;
    }
    bearing = (double)degrees + ((double)minutes / 60) + (seconds / 3600);
  }
  if (bearing > 360.0 || bearing < -360.0)
    bearing = 0.0;
  return bearing;
}
```