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

```asm
<draw_notempo>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  lea    D2(%rip),%rdi
  push   %rbx
  mov    %esi,%ebx
  sub    $0x38,%rsp
  movss  %xmm0,0xc(%rsp)
  cvtss2sd %xmm0,%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  mov    $0x1,%eax
  call   <a2b@plt>
  lea    0x20(%rsp),%rcx
  mov    %ebx,%esi
  mov    %rbp,%rdi
  lea    0x1c(%rsp),%rdx
  lea    0x24(%rsp),%r8
  call   <identify_note@plt>
  mov    0x1c(%rsp),%eax
  cmp    $0x1,%eax
  je     L109
  cmp    $0x2,%eax
  jne    L106
  lea    D14(%rip),%rdi
  xor    %eax,%eax
  call   <a2b@plt>
L78:
  mov    0x20(%rsp),%eax
  test   %eax,%eax
  je     L161
  mov    0x24(%rsp),%edx
  test   %edx,%edx
  jle    L58
  mov    0x1c(%rsp),%edx
  movss  D10(%rip),%xmm0
  movss  D101(%rip),%xmm1
  movss  D121(%rip),%xmm2
  cmp    $0x1,%edx
  je     L39
L134:
  sub    $0x2,%edx
  cmp    $0x1,%edx
  ja     L68
L183:
  sub    $0x1,%eax
  mov    %eax,0x20(%rsp)
  js     L161
  lea    D8(%rip),%rbp
  nopl   0x0(%rax)
L192:
  pxor   %xmm0,%xmm0
  mov    %rbp,%rdi
  mov    $0x1,%eax
  movss  %xmm1,0x8(%rsp)
  cvtss2sd %xmm1,%xmm0
  call   <a2b@plt>
  subl   $0x1,0x20(%rsp)
  movss  0x8(%rsp),%xmm1
  movaps %xmm1,%xmm0
  addss  D186(%rip),%xmm1
  jns    L192
  cmp    $0x5ff,%ebx
  jle    L133
L103:
  movss  D7(%rip),%xmm1
  addss  %xmm0,%xmm1
L19:
  mulss  0xc(%rsp),%xmm1
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  lea    D147(%rip),%rdi
  cvtss2sd %xmm1,%xmm0
  call   <a2b@plt>
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L116
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L161:
  movss  D74(%rip),%xmm0
  cmp    $0x5ff,%ebx
  jg     L103
L133:
  mov    0x24(%rsp),%esi
  movss  %xmm0,0x8(%rsp)
  test   %esi,%esi
  jle    L98
  xor    %eax,%eax
  mov    $0x14,%edx
  lea    D146(%rip),%rdi
  call   <a2b@plt>
  movss  D188(%rip),%xmm2
  movss  0x8(%rsp),%xmm0
  movss  D174(%rip),%xmm1
  comiss %xmm0,%xmm2
  ja     L19
  jmp    L103
  nopl   (%rax)
L98:
  mov    $0x14,%esi
  lea    D165(%rip),%rdi
  xor    %eax,%eax
  call   <a2b@plt>
  movss  0x8(%rsp),%xmm0
  movss  D7(%rip),%xmm1
  addss  %xmm0,%xmm1
  jmp    L19
  nopw   0x0(%rax,%rax,1)
L58:
  mov    0x1c(%rsp),%edx
  movss  D154(%rip),%xmm0
  movss  D38(%rip),%xmm1
  movss  D155(%rip),%xmm2
  cmp    $0x1,%edx
  jne    L134
L39:
  movaps %xmm0,%xmm1
  jmp    L183
  nopl   (%rax)
L109:
  lea    D183(%rip),%rdi
  xor    %eax,%eax
  call   <a2b@plt>
  jmp    L78
  nopl   0x0(%rax,%rax,1)
L106:
  lea    D83(%rip),%rdi
  xor    %eax,%eax
  call   <a2b@plt>
  jmp    L78
  nopl   0x0(%rax,%rax,1)
L68:
  movaps %xmm2,%xmm1
  jmp    L183
L116:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D2
datatype: string
name: extract_symbolic_data
arguments: data_tag: D14
datatype: string
name: extract_symbolic_data
arguments: data_tag: D10
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D101
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D121
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D8
datatype: string
name: extract_symbolic_data
arguments: data_tag: D186
datatype: f32
name: extract_symbolic_data
arguments: data_tag: D7
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D147
datatype: string
name: extract_symbolic_data
arguments: data_tag: D74
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D146
datatype: string
name: extract_symbolic_data
arguments: data_tag: D188
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D174
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D165
datatype: string
name: extract_symbolic_data
arguments: data_tag: D154
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D38
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D155
datatype: byte[4]
name: extract_symbolic_data
arguments: data_tag: D183
datatype: string
name: extract_symbolic_data
arguments: data_tag: D83
datatype: string

tool: D2: gsave %.2f dup scale 8 3 RM currentpoint 

tool: D14: HD

tool: {"D10": [0x00,0x00,0x50,0x41]}

tool: {"D101": [0x00,0x00,0x60,0x41]}

tool: {"D121": [0x00,0x00,0x40,0x41]}

tool: D8:  %.1f 0 dt

tool: D186: 3.5

tool: {"D7": [0x00,0x00,0x70,0x41]}

tool: D147:  grestore %.1f 0 RM


tool: {"D74": [0x00,0x00,0x80,0x40]}

tool: D146:  %d %d sfu

tool: {"D188": [0x00,0x00,0xc0,0x40]}

tool: {"D174": [0x00,0x00,0xa8,0x41]}

tool: D165:  %d su

tool: {"D154": [0x00,0x00,0x10,0x41]}

tool: {"D38": [0x00,0x00,0x20,0x41]}

tool: {"D155": [0x00,0x00,0x00,0x41]}

tool: D183: Hd

tool: D83: hd

assistant: ```c
void draw_notempo(struct SYMBOL *s, int len, float sc) {
  int head, dots, flags;
  float dx;
  a2b("gsave %.2f dup scale 8 3 RM currentpoint ", sc);
  identify_note(s, len, &head, &dots, &flags);
  switch (head) {
  case 2:
    a2b("HD");
    break;
  case 1:
    a2b("Hd");
    break;
  default:
    a2b("hd");
    break;
  }
  dx = 4;
  if (dots) {
    float dotx;
    dotx = 8;
    if (flags > 0)
      dotx += 4;
    switch (head) {
    case 3:
    case 2:
      dotx += 2;
      break;
    case 1:
      dotx += 1;
      break;
    }
    while (--dots >= 0) {
      a2b(" %.1f 0 dt", dotx);
      dx = dotx;
      dotx += 3.5;
    }
  }
  if (len < 1536) {
    if (flags <= 0)
      a2b(" %d su", 20);
    else {
      a2b(" %d %d sfu", flags, 20);
      if (dx < 6)
        dx = 6;
    }
  }
  a2b(" grestore %.1f 0 RM\n", (dx + 15) * sc);
}
```