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

```asm
<write_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %ecx,%eax
  mov    %esi,%ecx
  mov    %cl,-0x1c(%rbp)
  mov    %dl,-0x20(%rbp)
  mov    %al,-0x24(%rbp)
  movsbl -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <hex2ui@plt>
  mov    %al,-0x1(%rbp)
  movzbl -0x1(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L182
  movsd  D212(%rip),%xmm0
  mov    D181(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L193
L182:
  movsd  D236(%rip),%xmm0
  mov    D181(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L193:
  movzbl -0x1(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L175
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L93
L175:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L93:
  movzbl -0x1(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L217
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L168
L217:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L168:
  movzbl -0x1(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L16
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L160
L16:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L160:
  movsbl -0x20(%rbp),%eax
  mov    %eax,%edi
  call   <hex2ui@plt>
  mov    %al,-0x1(%rbp)
  movzbl -0x1(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L151
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L32
L151:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L32:
  movzbl -0x1(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L28
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L209
L28:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L209:
  movzbl -0x1(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L101
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L47
L101:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L47:
  movzbl -0x1(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L222
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L228
L222:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L228:
  movsbl -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <hex2ui@plt>
  mov    %al,-0x1(%rbp)
  movzbl -0x1(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L234
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L238
L234:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L238:
  movzbl -0x1(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L139
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L15
L139:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L15:
  movzbl -0x1(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L92
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L35
L92:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L35:
  movzbl -0x1(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L20
  movsd  D212(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
  jmp    L109
L20:
  movsd  D236(%rip),%xmm0
  mov    D225(%rip),%rdx
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <write_wave@plt>
L109:
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D212
data_type: f64
name: parse_data
arguments: data_tag: D181
data_type: f64
name: parse_data
arguments: data_tag: D236
data_type: f64
name: parse_data
arguments: data_tag: D225
data_type: f64

tool: D212: 1136

tool: D181: 0.047

tool: D236: 568

tool: D225: 0.063

assistant: ```c
void write_line(FILE *wavfile, char c1, char c2, char c3) {
  unsigned char ui;
  ui = hex2ui(c1);
  if (ui & 0x1)
    write_wave(wavfile, 0.047, 1136.0);
  else
    write_wave(wavfile, 0.047, 568.0);
  if (ui & 0x2)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x4)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x8)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  ui = hex2ui(c2);
  if (ui & 0x1)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x2)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x4)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x8)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  ui = hex2ui(c3);
  if (ui & 0x1)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x2)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x4)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
  if (ui & 0x8)
    write_wave(wavfile, 0.063, 1136.0);
  else
    write_wave(wavfile, 0.063, 568.0);
}
```