user: 请从给定的汇编指令推导出C源代码:

```asm
<vrna_file_SHAPE_read>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %esi,0x14(%rsp)
  mov    %rdx,0x8(%rsp)
  mov    %rcx,0x18(%rsp)
  movsd  %xmm0,(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x10(%rsp)
  test   %rdi,%rdi
  je     L356
  mov    %esi,%ebx
  lea    D71(%rip),%rsi
  call   <fopen@plt>
  mov    %rax,%r13
  test   %rax,%rax
  je     L176
  movslq 0x14(%rsp),%rsi
  test   %ebx,%ebx
  jle    L130
  mov    0x18(%rsp),%rcx
  mov    0x8(%rsp),%rbx
  mov    %rsi,%rdi
  lea    0x8(%rcx,%rsi,8),%rdx
  lea    0x8(%rcx),%rax
  cmp    %rdx,%rbx
  lea    (%rbx,%rsi,1),%rcx
  setae  %dl
  cmp    %rcx,%rax
  setae  %cl
  or     %cl,%dl
  je     L305
  lea    -0x1(%rsi),%edx
  cmp    $0xe,%edx
  jbe    L305
  shr    $0x4,%edi
  movsd  (%rsp),%xmm0
  movdqa D11(%rip),%xmm1
  mov    %rbx,%rdx
  mov    %edi,%ecx
  sub    $0x1,%ecx
  unpcklpd %xmm0,%xmm0
  shl    $0x4,%rcx
  lea    0x10(%rbx,%rcx,1),%rcx
  nopl   0x0(%rax)
L29:
  movups %xmm1,(%rdx)
  add    $0x10,%rdx
  sub    $0xffffffffffffff80,%rax
  movups %xmm0,-0x80(%rax)
  movups %xmm0,-0x70(%rax)
  movups %xmm0,-0x60(%rax)
  movups %xmm0,-0x50(%rax)
  movups %xmm0,-0x40(%rax)
  movups %xmm0,-0x30(%rax)
  movups %xmm0,-0x20(%rax)
  movups %xmm0,-0x10(%rax)
  cmp    %rcx,%rdx
  jne    L29
  mov    0x14(%rsp),%ebx
  mov    %ebx,%eax
  and    $0xfffffff0,%eax
  test   $0xf,%bl
  je     L130
  mov    %eax,%edx
  mov    0x8(%rsp),%r8
  mov    0x18(%rsp),%r9
  movsd  (%rsp),%xmm3
  lea    0x1(%rdx),%rdi
  movb   $0x4e,(%r8,%rdx,1)
  lea    0x0(,%rdi,8),%rcx
  movsd  %xmm3,(%r9,%rdi,8)
  lea    0x1(%rax),%edi
  cmp    %edi,%ebx
  jle    L130
  lea    0x2(%rax),%edi
  movb   $0x4e,0x1(%r8,%rdx,1)
  movsd  %xmm3,0x8(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x3(%rax),%edi
  movb   $0x4e,0x2(%r8,%rdx,1)
  movsd  %xmm3,0x10(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x4(%rax),%edi
  movb   $0x4e,0x3(%r8,%rdx,1)
  movsd  %xmm3,0x18(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x5(%rax),%edi
  movb   $0x4e,0x4(%r8,%rdx,1)
  movsd  %xmm3,0x20(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x6(%rax),%edi
  movb   $0x4e,0x5(%r8,%rdx,1)
  movsd  %xmm3,0x28(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x7(%rax),%edi
  movb   $0x4e,0x6(%r8,%rdx,1)
  movsd  %xmm3,0x30(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x8(%rax),%edi
  movb   $0x4e,0x7(%r8,%rdx,1)
  movsd  %xmm3,0x38(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0x9(%rax),%edi
  movb   $0x4e,0x8(%r8,%rdx,1)
  movsd  %xmm3,0x40(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0xa(%rax),%edi
  movb   $0x4e,0x9(%r8,%rdx,1)
  movsd  %xmm3,0x48(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0xb(%rax),%edi
  movb   $0x4e,0xa(%r8,%rdx,1)
  movsd  %xmm3,0x50(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0xc(%rax),%edi
  movb   $0x4e,0xb(%r8,%rdx,1)
  movsd  %xmm3,0x58(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  lea    0xd(%rax),%edi
  movb   $0x4e,0xc(%r8,%rdx,1)
  movsd  %xmm3,0x60(%r9,%rcx,1)
  cmp    %edi,%ebx
  jle    L130
  add    $0xe,%eax
  movb   $0x4e,0xd(%r8,%rdx,1)
  movsd  %xmm3,0x68(%r9,%rcx,1)
  cmp    %eax,%ebx
  jle    L130
  movb   $0x4e,0xe(%r8,%rdx,1)
  movsd  %xmm3,0x70(%r9,%rcx,1)
  nopw   0x0(%rax,%rax,1)
L130:
  mov    0x8(%rsp),%rax
  movl   $0x0,0x10(%rsp)
  lea    0x2c(%rsp),%r15
  lea    D38(%rip),%r14
  movb   $0x0,(%rax,%rsi,1)
  jmp    L96
  nopw   0x0(%rax,%rax,1)
L266:
  mov    %rbp,%rdi
  call   <free@plt>
L96:
  mov    %r13,%rdi
  call   <get_line@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L174
  movsd  (%rsp),%xmm2
  xor    %eax,%eax
  mov    %r15,%rdx
  mov    %r14,%rsi
  mov    %rbp,%rdi
  movb   $0x4e,0x2b(%rsp)
  movsd  %xmm2,0x30(%rsp)
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L266
  movslq 0x2c(%rsp),%rax
  cmp    0x14(%rsp),%eax
  jg     L296
  test   %eax,%eax
  jle    L296
  cmpb   $0x0,0x1(%rbp)
  lea    0x1(%rbp),%r12
  je     L36
  xor    %ebx,%ebx
  jmp    L240
  cs nopw 0x0(%rax,%rax,1)
L77:
  add    $0x1,%r12
  cmpb   $0x0,(%r12)
  je     L211
L240:
  movsbl -0x1(%r12),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L77
  movsbl (%r12),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L77
  test   %rbx,%rbx
  jne    L243
  mov    %r12,%rbx
  add    $0x1,%r12
  cmpb   $0x0,(%r12)
  jne    L240
  nopl   0x0(%rax)
L211:
  test   %rbx,%rbx
  jne    L61
L245:
  movslq 0x2c(%rsp),%rax
L36:
  movzbl 0x2b(%rsp),%edx
  mov    0x8(%rsp),%rsi
  movsd  0x30(%rsp),%xmm0
  mov    0x18(%rsp),%rcx
  mov    %dl,-0x1(%rsi,%rax,1)
  addl   $0x1,0x10(%rsp)
  movsd  %xmm0,(%rcx,%rax,8)
  jmp    L266
L296:
  lea    D20(%rip),%rdi
  call   <vrna_message_warning@plt>
  mov    %r13,%rdi
  call   <fclose@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  movl   $0x0,0x10(%rsp)
L356:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L400
  mov    0x10(%rsp),%eax
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L243:
  lea    0x2b(%rsp),%rdx
  lea    D97(%rip),%rsi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <sscanf@plt>
  lea    0x30(%rsp),%rdx
  mov    %r12,%rdi
  xor    %eax,%eax
  lea    D32(%rip),%rsi
  call   <sscanf@plt>
  movslq 0x2c(%rsp),%rax
  jmp    L36
  nop
L61:
  xor    %eax,%eax
  lea    0x30(%rsp),%rdx
  lea    D32(%rip),%rsi
  mov    %rbx,%rdi
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L245
  lea    0x2b(%rsp),%rdx
  lea    D97(%rip),%rsi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <sscanf@plt>
  jmp    L245
L174:
  mov    %r13,%rdi
  call   <fclose@plt>
  mov    0x10(%rsp),%eax
  test   %eax,%eax
  je     L431
  movl   $0x1,0x10(%rsp)
  jmp    L356
L305:
  mov    0x14(%rsp),%edx
  movsd  (%rsp),%xmm0
  xor    %eax,%eax
  mov    0x8(%rsp),%rcx
  mov    0x18(%rsp),%rdi
  nopl   0x0(%rax)
L312:
  movb   $0x4e,(%rcx,%rax,1)
  movsd  %xmm0,0x8(%rdi,%rax,8)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L312
  jmp    L130
L431:
  lea    D46(%rip),%rdi
  call   <vrna_message_warning@plt>
  jmp    L356
L176:
  lea    D68(%rip),%rdi
  call   <vrna_message_warning@plt>
  jmp    L356
L400:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D71
data_type: string
name: extract_symbolic_data
arguments: data_tag: D11
data_type: byte[16]
name: extract_symbolic_data
arguments: data_tag: D38
data_type: string
name: extract_symbolic_data
arguments: data_tag: D20
data_type: string
name: extract_symbolic_data
arguments: data_tag: D97
data_type: string
name: extract_symbolic_data
arguments: data_tag: D32
data_type: string
name: extract_symbolic_data
arguments: data_tag: D46
data_type: string
name: extract_symbolic_data
arguments: data_tag: D68
data_type: string

tool: D71: r

tool: {"D11": [0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e]}

tool: D38: %d

tool: D20: Provided SHAPE data outside of sequence scope

tool: D97: %c

tool: D32: %lf

tool: D46: SHAPE data file is empty

tool: D68: SHAPE data file could not be opened

assistant: ```c
int vrna_file_SHAPE_read(const char *file_name, int length, double default_value, char *sequence, double *values) {
  FILE *fp;
  char *line;
  int i;
  int count = 0;
  if (!file_name)
    return 0;
  if (!(fp = fopen(file_name, "r"))) {
    vrna_message_warning("SHAPE data file could not be opened");
    return 0;
  }
  for (i = 0; i < length; ++i) {
    sequence[i] = 'N';
    values[i + 1] = default_value;
  }
  sequence[length] = '\0';
  while ((line = get_line(fp))) {
    int position;
    unsigned char nucleotide = 'N';
    double reactivity = default_value;
    char *second_entry = 0;
    char *third_entry = 0;
    char *c;
    if (sscanf(line, "%d", &position) != 1) {
      free(line);
      continue;
    }
    if (position <= 0 || position > length) {
      vrna_message_warning("Provided SHAPE data outside of sequence scope");
      fclose(fp);
      free(line);
      return 0;
    }
    for (c = line + 1; *c; ++c) {
      if (isspace(*(c - 1)) && !isspace(*c)) {
        if (!second_entry) {
          second_entry = c;
        } else {
          third_entry = c;
          break;
        }
      }
    }
    if (second_entry) {
      if (third_entry) {
        sscanf(second_entry, "%c", &nucleotide);
        sscanf(third_entry, "%lf", &reactivity);
      } else if (sscanf(second_entry, "%lf", &reactivity) != 1)
        sscanf(second_entry, "%c", &nucleotide);
    }
    sequence[position - 1] = nucleotide;
    values[position] = reactivity;
    ++count;
    free(line);
  }
  fclose(fp);
  if (!count) {
    vrna_message_warning("SHAPE data file is empty");
    return 0;
  }
  return 1;
}
```