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

```asm
<draw_korean>:
  endbr64
  push   %r15
  pxor   %xmm0,%xmm0
  mov    %edi,%ecx
  push   %r14
  shl    $0x5,%ecx
  mov    %edx,%r14d
  movslq %esi,%rdx
  push   %r13
  push   %r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    %esi,%ebx
  shl    $0x5,%ebx
  sub    $0x1d8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1c8(%rsp)
  xor    %eax,%eax
  movaps %xmm0,(%rsp)
  and    $0xffffffef,%edi
  movaps %xmm0,0x10(%rsp)
  movdqa D95(%rip),%xmm0
  setne  %bpl
  movl   $0x0,0x50(%rsp)
  movaps %xmm0,0x20(%rsp)
  movdqa D37(%rip),%xmm0
  movl   $0x1,0xb0(%rsp)
  movaps %xmm0,0x30(%rsp)
  movdqa D64(%rip),%xmm0
  movaps %xmm0,0x40(%rsp)
  movdqa D19(%rip),%xmm0
  movaps %xmm0,0x60(%rsp)
  movdqa D105(%rip),%xmm0
  movaps %xmm0,0x70(%rsp)
  movdqa D63(%rip),%xmm0
  movaps %xmm0,0x80(%rsp)
  movdqa D91(%rip),%xmm0
  movaps %xmm0,0x90(%rsp)
  movdqa D82(%rip),%xmm0
  movaps %xmm0,0xa0(%rsp)
  pxor   %xmm0,%xmm0
  movaps %xmm0,0xc0(%rsp)
  movaps %xmm0,0xd0(%rsp)
  movaps %xmm0,0xe0(%rsp)
  movaps %xmm0,0xf0(%rsp)
  mov    (%rsp,%rdx,4),%eax
  movaps %xmm0,0x100(%rsp)
  movaps %xmm0,0x110(%rsp)
  movaps %xmm0,0x120(%rsp)
  movaps %xmm0,0x130(%rsp)
  movaps %xmm0,0x140(%rsp)
  movaps %xmm0,0x150(%rsp)
  movaps %xmm0,0x160(%rsp)
  movaps %xmm0,0x170(%rsp)
  movaps %xmm0,0x180(%rsp)
  movaps %xmm0,0x190(%rsp)
  movaps %xmm0,0x1a0(%rsp)
  movaps %xmm0,0x1b0(%rsp)
  test   %r14d,%r14d
  je     L47
  cmp    $0x4,%eax
  jbe    L43
L101:
  imul   $0x260,%eax,%eax
  lea    0xc0(%rsp),%r12
  mov    0x60(%rsp,%rdx,4),%r13d
  sub    $0x1,%r14d
  mov    %r12,%rdi
  shl    $0x5,%r14d
  imul   $0x360,%r13d,%r13d
  lea    (%rax,%rcx,1),%esi
  call   <mask_32byte@plt>
  lea    0x2(%rbp),%eax
  mov    %r12,%rdi
  imul   $0x2a0,%eax,%eax
  lea    0x1300(%rbx,%rax,1),%esi
  call   <mask_32byte@plt>
  lea    0x1d80(%r13,%r14,1),%esi
  mov    %r12,%rdi
  call   <mask_32byte@plt>
L109:
  xor    %ebx,%ebx
  lea    D62(%rip),%r13
  lea    D45(%rip),%r14
  lea    D94(%rip),%r15
  jmp    L14
  nopl   0x0(%rax)
L67:
  mov    %r13,%rdi
  and    $0xf,%ebp
  call   <printf@plt>
  cmp    $0xf,%ebp
  je     L3
L62:
  add    $0x1,%rbx
  cmp    $0x100,%rbx
  je     L12
L14:
  cmpb   $0x1,(%r12,%rbx,1)
  mov    %ebx,%ebp
  jne    L67
  mov    %r14,%rdi
  and    $0xf,%ebp
  call   <printf@plt>
  cmp    $0xf,%ebp
  jne    L62
L3:
  mov    %r15,%rdi
  add    $0x1,%rbx
  call   <printf@plt>
  cmp    $0x100,%rbx
  jne    L14
L12:
  mov    0x1c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L57
  add    $0x1d8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L47:
  imul   $0x260,%eax,%eax
  lea    0xc0(%rsp),%r12
  imul   $0x2a0,%ebp,%ebp
  mov    %r12,%rdi
  lea    (%rax,%rcx,1),%esi
  call   <mask_32byte@plt>
  lea    0x1300(%rbx,%rbp,1),%esi
  mov    %r12,%rdi
  call   <mask_32byte@plt>
  jmp    L109
L43:
  lea    D70(%rip),%rsi
  mov    (%rsi,%rax,4),%eax
  jmp    L101
L57:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_tag: D95
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D37
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D64
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D19
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D105
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D63
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D91
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D82
datatype: byte[16]
name: retrieve_data
arguments: data_tag: D62
datatype: string
name: retrieve_data
arguments: data_tag: D45
datatype: string
name: retrieve_data
arguments: data_tag: D94
datatype: string
name: retrieve_data
arguments: data_tag: D70
datatype: string

tool: {"D95": [0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00]}

tool: {"D37": [0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

tool: {"D64": [0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00]}

tool: {"D19": [0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00]}

tool: {"D105": [0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00]}

tool: {"D63": [0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: {"D91": [0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00]}

tool: {"D82": [0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

tool: D62:   

tool: D45:  *

tool: D94: 


tool: D70: 

assistant: ```c
void draw_korean(int cho, int jung, int jong) {
  int CHO_IDX = 0;
  int JUNG_IDX = CHO_IDX + 32 * 19 * 8;
  int JONG_IDX = JUNG_IDX + 32 * 21 * 4;
  int CHO_MAP[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 1, 2, 4, 4, 4, 2, 1, 3, 0};
  int JONG_MAP[] = {0, 2, 0, 2, 1, 2, 1, 2, 3, 0, 2, 1, 3, 3, 1, 2, 1, 3, 3, 1, 1};
  int CHO_TYPE = -1;
  int JUNG_TYPE = -1;
  int JONG_TYPE = -1;
  char out[256] = {
      0,
  };
  int i;
  CHO_TYPE = CHO_MAP[jung];
  if (jong != 0) {
    if (CHO_TYPE == 0)
      CHO_TYPE = 5;
    else if (CHO_TYPE == 1)
      CHO_TYPE = 6;
    else if (CHO_TYPE == 2)
      CHO_TYPE = 6;
    else if (CHO_TYPE == 3)
      CHO_TYPE = 7;
    else if (CHO_TYPE == 4)
      CHO_TYPE = 7;
  }
  JUNG_TYPE = (cho == 0 || cho == 16) ? 0 : 1;
  JUNG_TYPE += (jong != 0) ? 2 : 0;
  JONG_TYPE = JONG_MAP[jung];
  mask_32byte(out, CHO_IDX + (32 * 19 * CHO_TYPE) + (32 * cho));
  mask_32byte(out, JUNG_IDX + (32 * 21 * JUNG_TYPE) + (32 * jung));
  if (jong != 0)
    mask_32byte(out, JONG_IDX + (32 * 27 * JONG_TYPE) + (32 * (jong - 1)));
  for (i = 0; i < 256; i++) {
    if (out[i] == 1)
      printf(" *");
    else
      printf("  ");
    if (i % 16 == 15)
      printf("\n");
  }
}
```