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

```asm
<draw_hex_table>:
  endbr64
  push   %r14
  lea    D73(%rip),%rdi
  xor    %r14d,%r14d
  push   %r13
  lea    D21(%rip),%r13
  push   %r12
  lea    D46(%rip),%r12
  push   %rbp
  lea    D78(%rip),%rbp
  push   %rbx
  lea    D63(%rip),%rbx
  call   <puts@plt>
  nopw   0x0(%rax,%rax,1)
L129:
  xor    %edx,%edx
  xor    %esi,%esi
  xor    %r8d,%r8d
  xor    %edi,%edi
L43:
  lea    (%rdx,%rdx,1),%ecx
  mov    %r14d,%eax
  shr    %cl,%eax
  and    $0x3,%eax
  cmp    $0x2,%eax
  je     L0
  cmp    $0x3,%eax
  je     L24
  mov    %edx,%ecx
  mov    %eax,%r9d
  shl    %cl,%r9d
  mov    %r9d,%ecx
  or     %esi,%ecx
  cmp    $0x1,%eax
  cmove  %rcx,%rsi
L92:
  add    $0x1,%edx
  cmp    $0x4,%edx
  jne    L43
  cmp    $0x4,%edi
  je     L117
  cmp    $0x4,%r8d
  je     L54
  test   %edi,%edi
  je     L55
  test   %r8d,%r8d
  jne    L2
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <printf@plt>
L112:
  add    $0x1,%r14d
  test   $0x7,%r14b
  je     L163
L36:
  cmp    $0x100,%r14d
  jne    L129
  pop    %rbx
  lea    D33(%rip),%rdi
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  jmp    1080 <puts@plt>
  nopw   0x0(%rax,%rax,1)
L24:
  add    $0x1,%edi
  jmp    L92
  nopl   (%rax)
L0:
  add    $0x1,%r8d
  jmp    L92
  xchg   %ax,%ax
L163:
  mov    $0xa,%edi
  call   <putchar@plt>
  jmp    L36
  nopl   0x0(%rax)
L2:
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L112
  nopl   0x0(%rax)
L55:
  test   %r8d,%r8d
  jne    L2
  movsbl 0x0(%r13,%rsi,1),%esi
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L112
  nopw   0x0(%rax,%rax,1)
L117:
  lea    D37(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L112
  nopl   0x0(%rax,%rax,1)
L54:
  lea    D61(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L112
```

tool_calls: name: unpack_data
arguments: label: D73
datatype: string
name: unpack_data
arguments: label: D21
datatype: string
name: unpack_data
arguments: label: D46
datatype: string
name: unpack_data
arguments: label: D78
datatype: string
name: unpack_data
arguments: label: D63
datatype: string
name: unpack_data
arguments: label: D33
datatype: string
name: unpack_data
arguments: label: D37
datatype: string
name: unpack_data
arguments: label: D61
datatype: string

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

tool: D21: 0123456789abcdef

tool: D46:  '%c',

tool: D78:  'X',

tool: D63:  'Z',

tool: D33: };

tool: D37:  'z',

tool: D61:  'x',

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