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

```asm
<GetNextLabel>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L128
L53:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x19(%rbp)
  cmpb   $0x5c,-0x19(%rbp)
  jne    L36
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L36
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x19(%rbp)
  mov    -0x28(%rbp),%rax
  sub    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L36
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L36
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L36
  mov    -0x28(%rbp),%rax
  sub    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  imul   $0x64,%eax,%ecx
  mov    -0x10(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x18(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  jne    L77
  movl   $0x2d,-0x18(%rbp)
L77:
  cmpl   $0xff,-0x18(%rbp)
  jg     L36
  mov    -0x18(%rbp),%eax
  mov    %al,-0x19(%rbp)
  addq   $0x2,-0x28(%rbp)
L36:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl -0x19(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x40,%rax
  cmp    %rax,-0x8(%rbp)
  jb     L128
  mov    -0x30(%rbp),%rax
  add    $0x3f,%rax
  movb   $0x0,(%rax)
  mov    $0x0,%eax
  jmp    L47
L128:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L15
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L53
L15:
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jne    L132
  mov    $0x0,%eax
  jmp    L47
L132:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L78
  addq   $0x1,-0x28(%rbp)
L78:
  mov    -0x28(%rbp),%rax
L47:
  leave
  ret
```

assistant: ```c
const char *GetNextLabel(const char *cstr, char label[64]) {
  char *ptr = label;
  while (*cstr && *cstr != '.') {
    char c = *cstr++;
    if (c == '\\' && *cstr) {
      c = *cstr++;
      if (isdigit(cstr[-1]) && isdigit(cstr[0]) && isdigit(cstr[1])) {
        int v0 = cstr[-1] - '0';
        int v1 = cstr[0] - '0';
        int v2 = cstr[1] - '0';
        int val = v0 * 100 + v1 * 10 + v2;
        if (val == 0)
          val = '-';
        if (val <= 255) {
          c = (char)val;
          cstr += 2;
        }
      }
    }
    *ptr++ = c;
    if (ptr >= label + 64) {
      label[63] = 0;
      return (NULL);
    }
  }
  *ptr = 0;
  if (ptr == label)
    return (NULL);
  if (*cstr)
    cstr++;
  return (cstr);
}
```