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

```asm
<nasm_unquote>:
  endbr64
  movzbl (%rdi),%edx
  xor    %eax,%eax
  test   %dl,%dl
  je     L1384
  push   %r14
  push   %r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  lea    0x1(%rdi),%rbx
  cmp    $0x27,%dl
  je     L783
  cmp    $0x60,%dl
  je     L402
  cmp    $0x22,%dl
  je     L783
  xor    %esi,%esi
  call   <strchr@plt>
  mov    %rax,%rbx
L904:
  sub    %rbp,%rax
L1091:
  test   %r12,%r12
  je     L1207
L512:
  mov    %rbx,(%r12)
L1207:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L402:
  movzbl 0x1(%rdi),%edx
  lea    0x2(%rdi),%rcx
  lea    D8(%rip),%r13
  test   %dl,%dl
  je     L1091
L897:
  cmp    $0x5c,%dl
  je     L548
L255:
  cmp    $0x60,%dl
  je     L607
  mov    %dl,(%rdi)
  movzbl (%rcx),%edx
  add    $0x1,%rdi
  test   %dl,%dl
  je     L1279
  mov    %rcx,%rbx
  add    $0x1,%rcx
  cmp    $0x5c,%dl
  jne    L255
L548:
  movzbl (%rcx),%edx
  test   %dl,%dl
  je     L1279
  lea    -0x30(%rdx),%eax
  lea    0x1(%rcx),%rbx
  cmp    $0x48,%al
  ja     L763
  movzbl %al,%eax
  movslq 0x0(%r13,%rax,4),%rax
  add    %r13,%rax
  notrack jmp *%rax
  cs nopw 0x0(%rax,%rax,1)
L1384:
  ret
  nopl   0x0(%rax)
L783:
  movzbl 0x1(%rbp),%eax
  cmp    %al,%dl
  je     L872
  test   %al,%al
  jne    L589
L872:
  mov    %rbp,%rcx
  xor    %eax,%eax
  jmp    L968
  nopl   0x0(%rax,%rax,1)
L196:
  test   %al,%al
  je     L1158
L589:
  mov    %al,-0x1(%rbx)
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  lea    -0x1(%rbx),%rcx
  cmp    %al,%dl
  jne    L196
L1158:
  mov    %rcx,%rax
  sub    %rbp,%rax
L968:
  movb   $0x0,(%rcx)
  test   %r12,%r12
  jne    L512
  jmp    L1207
  xchg   %ax,%ax
L607:
  mov    %rdi,%rax
  sub    %rbp,%rax
  test   %r12,%r12
  jne    L512
  jmp    L1207
  nopl   0x0(%rax)
L763:
  mov    %dl,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  je     L904
  nopw   0x0(%rax,%rax,1)
L810:
  add    $0x2,%rcx
  mov    %rax,%rdi
  jmp    L897
  nopl   0x0(%rax)
  sub    $0x30,%edx
  lea    0x1(%rdi),%rax
  movsbl %dl,%esi
  movzbl 0x1(%rcx),%edx
  test   %dl,%dl
  je     L583
  sub    $0x30,%edx
  cmp    $0x7,%dl
  ja     L174
  movsbl %dl,%edx
  lea    0x2(%rcx),%rbx
  lea    (%rdx,%rsi,8),%esi
  movzbl 0x2(%rcx),%edx
  test   %dl,%dl
  je     L583
  sub    $0x30,%edx
  cmp    $0x7,%dl
  ja     L174
  movsbl %dl,%edx
  lea    0x3(%rcx),%rbx
  lea    (%rdx,%rsi,8),%edx
  mov    %dl,(%rdi)
  movzbl 0x3(%rcx),%edx
  test   %dl,%dl
  je     L904
  add    $0x4,%rcx
  mov    %rax,%rdi
  jmp    L897
  movsbl 0x1(%rcx),%eax
  test   %al,%al
  je     L738
  mov    %eax,%esi
  lea    0x2(%rcx),%r9
  and    $0xffffffdf,%esi
  sub    $0x41,%esi
  cmp    $0x5,%sil
  jbe    L653
  lea    -0x30(%rax),%esi
  cmp    $0x9,%sil
  jbe    L653
L543:
  mov    %dl,(%rdi)
  movzbl (%rbx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  je     L904
L289:
  lea    0x1(%rbx),%rcx
  mov    %rax,%rdi
  jmp    L897
  movb   $0x7,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax)
  movb   $0x9,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax,%rax,1)
  movb   $0xd,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax,%rax,1)
  movb   $0xa,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax,%rax,1)
  movb   $0xc,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax,%rax,1)
  movsbl 0x1(%rcx),%eax
  test   %al,%al
  je     L1446
  lea    0x2(%rcx),%r14
  mov    $0x8,%ecx
L534:
  mov    %eax,%esi
  and    $0xffffffdf,%esi
  sub    $0x41,%esi
  cmp    $0x5,%sil
  jbe    L1139
  lea    -0x30(%rax),%esi
  cmp    $0x9,%sil
  jbe    L1139
  mov    %rbx,%r14
L446:
  mov    %dl,(%rdi)
  movzbl (%r14),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  je     L267
  lea    0x1(%r14),%rcx
  mov    %rax,%rdi
  mov    %r14,%rbx
  jmp    L897
  movb   $0x1b,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  movb   $0xb,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopl   0x0(%rax,%rax,1)
  movsbl 0x1(%rcx),%eax
  test   %al,%al
  je     L1446
  lea    0x2(%rcx),%r14
  mov    $0x4,%ecx
  jmp    L534
  movb   $0x8,(%rdi)
  movzbl 0x1(%rcx),%edx
  lea    0x1(%rdi),%rax
  test   %dl,%dl
  jne    L810
  jmp    L904
  nopw   0x0(%rax,%rax,1)
L174:
  mov    %sil,(%rdi)
  movzbl (%rbx),%edx
  test   %dl,%dl
  jne    L289
  jmp    L904
  nopl   0x0(%rax,%rax,1)
L653:
  cmp    $0x60,%al
  jg     L302
  cmp    $0x40,%al
  jg     L625
  sub    $0x30,%eax
L444:
  movsbl 0x2(%rcx),%esi
  test   %sil,%sil
  je     L348
  mov    %esi,%r10d
  lea    0x3(%rcx),%r8
  and    $0xffffffdf,%r10d
  sub    $0x41,%r10d
  cmp    $0x5,%r10b
  jbe    L1134
  lea    -0x30(%rsi),%r10d
  cmp    $0x9,%r10b
  jbe    L1134
  cmp    %rbx,%r9
  jbe    L1282
  mov    %eax,%edx
  mov    %r9,%rbx
  jmp    L543
  nopw   0x0(%rax,%rax,1)
L1134:
  shl    $0x4,%eax
  mov    %eax,%edx
  cmp    $0x60,%sil
  jle    L1237
  sub    $0x57,%esi
  movsbl %sil,%esi
L1039:
  add    %esi,%edx
  lea    0x1(%rdi),%rax
  mov    %dl,(%rdi)
  movzbl 0x3(%rcx),%edx
  test   %dl,%dl
  je     L951
  add    $0x4,%rcx
  mov    %rax,%rdi
  mov    %r8,%rbx
  jmp    L897
  nopl   0x0(%rax)
L302:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L444
  nopl   0x0(%rax,%rax,1)
L1139:
  cmp    $0x60,%al
  jg     L1404
  lea    -0x30(%rax),%esi
  cmp    $0x40,%al
  jle    L1499
  sub    $0x37,%eax
  movsbl %al,%esi
L1499:
  movsbl (%r14),%eax
  test   %al,%al
  je     L835
  mov    %eax,%r9d
  lea    0x1(%r14),%r8
  and    $0xffffffdf,%r9d
  sub    $0x41,%r9d
  cmp    $0x5,%r9b
  jbe    L940
  lea    -0x30(%rax),%r9d
  cmp    $0x9,%r9b
  jbe    L940
L1491:
  cmp    %rbx,%r14
  jbe    L446
  call   <emit_utf8@plt>
  movzbl (%r14),%edx
  mov    %rax,%rdi
  test   %dl,%dl
  je     L262
  lea    0x1(%r14),%rcx
  mov    %r14,%rbx
  jmp    L897
  nopl   0x0(%rax)
L1237:
  cmp    $0x40,%sil
  jle    L6
  sub    $0x37,%esi
  movsbl %sil,%esi
  jmp    L1039
L583:
  mov    %sil,(%rdi)
  sub    %rbp,%rax
  jmp    L1091
L348:
  cmp    %rbx,%r9
  jbe    L1389
  mov    %eax,%edx
L1389:
  lea    0x1(%rdi),%rax
  mov    %dl,(%rdi)
  mov    %r9,%rbx
  sub    %rbp,%rax
  jmp    L1091
L162:
  mov    %r8,%r14
L835:
  cmp    %r14,%rbx
  jb     L225
L475:
  mov    %dl,(%rdi)
  lea    0x1(%rdi),%rax
L267:
  sub    %rbp,%rax
  mov    %r14,%rbx
  jmp    L1091
  cs nopw 0x0(%rax,%rax,1)
L1282:
  mov    %r9,%rbx
  jmp    L543
  nopl   0x0(%rax,%rax,1)
L625:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L444
L1404:
  sub    $0x57,%eax
  movsbl %al,%esi
  jmp    L1499
L940:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L1356
  cmp    $0x40,%al
  jg     L760
  sub    $0x30,%eax
L800:
  add    %eax,%esi
  movsbl 0x1(%r14),%eax
  test   %al,%al
  je     L162
  mov    %eax,%r10d
  lea    0x2(%r14),%r9
  and    $0xffffffdf,%r10d
  sub    $0x41,%r10d
  cmp    $0x5,%r10b
  jbe    L907
  lea    -0x30(%rax),%r10d
  cmp    $0x9,%r10b
  jbe    L907
L1049:
  mov    %r8,%r14
  jmp    L1491
L6:
  sub    $0x30,%esi
  jmp    L1039
L1279:
  mov    %rdi,%rax
  mov    %rcx,%rbx
  sub    %rbp,%rax
  jmp    L1091
L225:
  call   <emit_utf8@plt>
  mov    %r14,%rbx
  sub    %rbp,%rax
  jmp    L1091
L1356:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L800
L907:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L106
  cmp    $0x40,%al
  jg     L224
  sub    $0x30,%eax
L428:
  add    %eax,%esi
  movsbl 0x2(%r14),%eax
  test   %al,%al
  je     L632
  mov    %eax,%r10d
  lea    0x3(%r14),%r8
  and    $0xffffffdf,%r10d
  sub    $0x41,%r10d
  cmp    $0x5,%r10b
  jbe    L866
  lea    -0x30(%rax),%r10d
  cmp    $0x9,%r10b
  jbe    L866
  mov    %r9,%r14
  jmp    L1491
L951:
  sub    %rbp,%rax
  mov    %r8,%rbx
  jmp    L1091
L760:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L800
L106:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L428
L866:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L391
  cmp    $0x40,%al
  jg     L584
  sub    $0x30,%eax
L1213:
  add    %eax,%esi
  cmp    $0x4,%ecx
  je     L717
  movsbl 0x3(%r14),%eax
  test   %al,%al
  je     L162
  mov    %eax,%r9d
  lea    0x4(%r14),%rcx
  and    $0xffffffdf,%r9d
  sub    $0x41,%r9d
  cmp    $0x5,%r9b
  jbe    L102
  lea    -0x30(%rax),%r9d
  cmp    $0x9,%r9b
  ja     L1049
L102:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L88
  cmp    $0x40,%al
  jg     L245
  sub    $0x30,%eax
L232:
  add    %eax,%esi
  movsbl 0x4(%r14),%eax
  test   %al,%al
  je     L744
  mov    %eax,%r9d
  lea    0x5(%r14),%r8
  and    $0xffffffdf,%r9d
  sub    $0x41,%r9d
  cmp    $0x5,%r9b
  jbe    L244
  lea    -0x30(%rax),%r9d
  cmp    $0x9,%r9b
  jbe    L244
L470:
  mov    %rcx,%r14
  jmp    L1491
L1446:
  mov    %rbx,%r14
  jmp    L475
L224:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L428
L391:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L1213
L738:
  mov    %rbx,%r9
  jmp    L1389
L262:
  sub    %rbp,%rax
  mov    %r14,%rbx
  jmp    L1091
L717:
  mov    %r8,%rbx
L1198:
  call   <emit_utf8@plt>
  movzbl (%rbx),%edx
  mov    %rax,%rdi
  test   %dl,%dl
  je     L607
  lea    0x1(%rbx),%rcx
  jmp    L897
L584:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L1213
L244:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L456
  cmp    $0x40,%al
  jg     L1328
  sub    $0x30,%eax
L1488:
  add    %eax,%esi
  movsbl 0x5(%r14),%eax
  test   %al,%al
  je     L162
  mov    %eax,%r9d
  lea    0x6(%r14),%rcx
  and    $0xffffffdf,%r9d
  sub    $0x41,%r9d
  cmp    $0x5,%r9b
  jbe    L1090
  lea    -0x30(%rax),%r9d
  cmp    $0x9,%r9b
  ja     L1049
L1090:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jg     L1399
  cmp    $0x40,%al
  jg     L867
  sub    $0x30,%eax
L638:
  add    %eax,%esi
  movsbl 0x6(%r14),%eax
  test   %al,%al
  je     L744
  mov    %eax,%r8d
  add    $0x7,%r14
  and    $0xffffffdf,%r8d
  sub    $0x41,%r8d
  cmp    $0x5,%r8b
  jbe    L72
  lea    -0x30(%rax),%r8d
  cmp    $0x9,%r8b
  ja     L470
L72:
  shl    $0x4,%esi
  cmp    $0x60,%al
  jle    L500
  sub    $0x57,%eax
  movsbl %al,%eax
L938:
  add    %eax,%esi
  mov    %r14,%rbx
  jmp    L1198
L88:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L232
L456:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L1488
L632:
  mov    %r9,%r14
  jmp    L835
L245:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L232
L1399:
  sub    $0x57,%eax
  movsbl %al,%eax
  jmp    L638
L1328:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L1488
L744:
  mov    %rcx,%r14
  jmp    L835
L500:
  cmp    $0x40,%al
  jle    L1364
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L938
L867:
  sub    $0x37,%eax
  movsbl %al,%eax
  jmp    L638
L1364:
  sub    $0x30,%eax
  jmp    L938
```

assistant: ```c
size_t nasm_unquote(char *str, char **ep) {
  char bq;
  char *p, *q;
  char *escp = NULL;
  char c;
  enum unq_state {
    st_start,
    st_backslash,
    st_hex,
    st_oct,
    st_ucs,
  } state;
  int ndig = 0;
  int32_t nval = 0;
  p = q = str;
  bq = *p++;
  if (!bq)
    return 0;
  switch (bq) {
  case '\'':
  case '\"':
    while ((c = *p) && c != bq) {
      p++;
      *q++ = c;
    }
    *q = '\0';
    break;
  case '`':
    state = st_start;
    while ((c = *p)) {
      p++;
      switch (state) {
      case st_start:
        switch (c) {
        case '\\':
          state = st_backslash;
          break;
        case '`':
          p--;
          goto out;
        default:
          *q++ = c;
          break;
        }
        break;
      case st_backslash:
        state = st_start;
        escp = p;
        nval = 0;
        switch (c) {
        case 'a':
          *q++ = 7;
          break;
        case 'b':
          *q++ = 8;
          break;
        case 'e':
          *q++ = 27;
          break;
        case 'f':
          *q++ = 12;
          break;
        case 'n':
          *q++ = 10;
          break;
        case 'r':
          *q++ = 13;
          break;
        case 't':
          *q++ = 9;
          break;
        case 'u':
          state = st_ucs;
          ndig = 4;
          break;
        case 'U':
          state = st_ucs;
          ndig = 8;
          break;
        case 'v':
          *q++ = 11;
          break;
        case 'x':
        case 'X':
          state = st_hex;
          ndig = 2;
          break;
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
          state = st_oct;
          ndig = 2;
          nval = c - '0';
          break;
        default:
          *q++ = c;
          break;
        }
        break;
      case st_oct:
        if (c >= '0' && c <= '7') {
          nval = (nval << 3) + (c - '0');
          if (!--ndig) {
            *q++ = nval;
            state = st_start;
          }
        } else {
          p--;
          *q++ = nval;
          state = st_start;
        }
        break;
      case st_hex:
        if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
          nval = (nval << 4) + ((c) >= 'a' ? (c) - 'a' + 10 : (c) >= 'A' ? (c) - 'A' + 10 : (c) - '0');
          if (!--ndig) {
            *q++ = nval;
            state = st_start;
          }
        } else {
          p--;
          *q++ = (p > escp) ? nval : escp[-1];
          state = st_start;
        }
        break;
      case st_ucs:
        if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
          nval = (nval << 4) + ((c) >= 'a' ? (c) - 'a' + 10 : (c) >= 'A' ? (c) - 'A' + 10 : (c) - '0');
          if (!--ndig) {
            q = emit_utf8(q, nval);
            state = st_start;
          }
        } else {
          p--;
          if (p > escp)
            q = emit_utf8(q, nval);
          else
            *q++ = escp[-1];
          state = st_start;
        }
        break;
      }
    }
    switch (state) {
    case st_start:
    case st_backslash:
      break;
    case st_oct:
      *q++ = nval;
      break;
    case st_hex:
      *q++ = (p > escp) ? nval : escp[-1];
      break;
    case st_ucs:
      if (p > escp)
        q = emit_utf8(q, nval);
      else
        *q++ = escp[-1];
      break;
    }
  out:
    break;
  default:
    p = q = strchr(str, '\0');
    break;
  }
  if (ep)
    *ep = p;
  return q - str;
}
```