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

```asm
<write_line>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbx
  mov    %edx,%r13d
  mov    %ecx,%r12d
  movsbl %sil,%edi
  call   <hex2ui@plt>
  mov    %eax,%ebp
  test   $0x1,%al
  je     L223
  movsd  D232(%rip),%xmm1
  movsd  D124(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L81:
  test   $0x2,%bpl
  je     L158
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L69:
  test   $0x4,%bpl
  je     L103
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L100:
  test   $0x8,%bpl
  je     L171
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L67:
  movsbl %r13b,%edi
  call   <hex2ui@plt>
  mov    %eax,%ebp
  test   $0x1,%al
  je     L227
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L154:
  test   $0x2,%bpl
  je     L222
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L150:
  test   $0x4,%bpl
  je     L101
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L93:
  test   $0x8,%bpl
  je     L9
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L119:
  movsbl %r12b,%edi
  call   <hex2ui@plt>
  mov    %eax,%ebp
  test   $0x1,%al
  je     L51
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L148:
  test   $0x2,%bpl
  je     L105
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L232:
  test   $0x4,%bpl
  je     L22
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L140:
  test   $0x8,%bpl
  je     L123
  movsd  D232(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
L4:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L223:
  movsd  D66(%rip),%xmm1
  movsd  D124(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L81
L158:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L69
L103:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L100
L171:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L67
L227:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L154
L222:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L150
L101:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L93
L9:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L119
L51:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L148
L105:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L232
L22:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L140
L123:
  movsd  D66(%rip),%xmm1
  movsd  D261(%rip),%xmm0
  mov    %rbx,%rdi
  call   <write_wave@plt>
  jmp    L4
```

tool_calls: name: parse_data
arguments: data_tag: D232
type: f64
name: parse_data
arguments: data_tag: D124
type: f64
name: parse_data
arguments: data_tag: D261
type: f64
name: parse_data
arguments: data_tag: D66
type: f64

tool: D232: 1136

tool: D124: 0.047

tool: D261: 0.063

tool: D66: 568

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);
}
```