user: 下面的汇编指令对应的C源代码是什么：

```asm
<draw_hex_table>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x14(%rbp)
  jmp    L11
L39:
  movl   $0x0,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0x0,-0x4(%rbp)
  jmp    L211
L96:
  mov    -0x4(%rbp),%eax
  add    %eax,%eax
  mov    -0x14(%rbp),%edx
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%eax
  and    $0x3,%eax
  cmp    $0x3,%eax
  je     L46
  cmp    $0x3,%eax
  ja     L181
  cmp    $0x2,%eax
  je     L5
  cmp    $0x2,%eax
  ja     L181
  test   %eax,%eax
  je     L128
  cmp    $0x1,%eax
  jne    L181
  mov    -0x4(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    %edx,%eax
  or     %eax,-0x8(%rbp)
  jmp    L181
L5:
  addl   $0x1,-0xc(%rbp)
  jmp    L181
L46:
  addl   $0x1,-0x10(%rbp)
  jmp    L181
L128:
  nop
L181:
  addl   $0x1,-0x4(%rbp)
L211:
  cmpl   $0x3,-0x4(%rbp)
  jbe    L96
  cmpl   $0x4,-0x10(%rbp)
  jne    L171
  lea    D77(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L153
L171:
  cmpl   $0x4,-0xc(%rbp)
  jne    L55
  lea    D1(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L153
L55:
  cmpl   $0x0,-0x10(%rbp)
  je     L3
  cmpl   $0x0,-0xc(%rbp)
  jne    L3
  lea    D63(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L153
L3:
  cmpl   $0x0,-0xc(%rbp)
  je     L69
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L153
L69:
  mov    -0x8(%rbp),%eax
  lea    D4(%rip),%rdx
  movzbl (%rax,%rdx,1),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D39(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L153:
  mov    -0x14(%rbp),%eax
  add    $0x1,%eax
  and    $0x7,%eax
  test   %eax,%eax
  jne    L60
  mov    $0xa,%edi
  call   <putchar@plt>
L60:
  addl   $0x1,-0x14(%rbp)
L11:
  cmpl   $0xff,-0x14(%rbp)
  jbe    L39
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  nop
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D36
type_guessed: string
name: unpack_data
arguments: data_label: D77
type_guessed: string
name: unpack_data
arguments: data_label: D1
type_guessed: string
name: unpack_data
arguments: data_label: D63
type_guessed: string
name: unpack_data
arguments: data_label: D2
type_guessed: string
name: unpack_data
arguments: data_label: D4
type_guessed: string
name: unpack_data
arguments: data_label: D39
type_guessed: string
name: unpack_data
arguments: data_label: D8
type_guessed: string

tool: D36: extern const char hex_digits[256] = {

tool: D77:  'z',

tool: D1:  'x',

tool: D63:  'Z',

tool: D2:  'X',

tool: D4: 0123456789abcdef

tool: D39:  '%c',

tool: D8: };

assistant: ```c
void draw_hex_table(void) {
  unsigned idx;
  printf("extern const char hex_digits[256] = {\n");
  for (idx = 0; idx < 256; idx += 1) {
    unsigned cnt_z = 0, cnt_x = 0;
    unsigned bv = 0, bdx;
    for (bdx = 0; bdx < 4; bdx += 1) {
      switch ((idx >> (bdx * 2)) & 3) {
      case 0:
        break;
      case 1:
        bv |= 1 << bdx;
        break;
      case 2:
        cnt_x += 1;
        break;
      case 3:
        cnt_z += 1;
        break;
      }
    }
    if (cnt_z == 4)
      printf(" 'z',");
    else if (cnt_x == 4)
      printf(" 'x',");
    else if ((cnt_z > 0) && (cnt_x == 0))
      printf(" 'Z',");
    else if (cnt_x > 0)
      printf(" 'X',");
    else
      printf(" '%c',", "0123456789abcdef"[bv]);
    if (((idx + 1) % 8) == 0)
      printf("\n");
  }
  printf("};\n");
}
```