user: 请将以下的汇编代码转换成C语言代码:

```asm
<draw_korean>:
  endbr64
  push   %r15
  mov    %edi,%ecx
  pxor   %xmm0,%xmm0
  movabs $0x400000004,%rdi
  push   %r14
  mov    %edx,%r14d
  movabs $0x300000001,%rdx
  push   %r13
  push   %r12
  push   %rbp
  xor    %ebp,%ebp
  push   %rbx
  mov    %esi,%ebx
  movabs $0x300000003,%rsi
  sub    $0x1d8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1c8(%rsp)
  xor    %eax,%eax
  mov    %rdi,0x38(%rsp)
  movabs $0x200000004,%rdi
  movabs $0x200000001,%rax
  mov    %rsi,0x28(%rsp)
  mov    %rdi,0x40(%rsp)
  sub    $0x4,%rdi
  mov    %rsi,0x90(%rsp)
  mov    %ecx,%esi
  mov    %rdx,0x20(%rsp)
  shl    $0x5,%esi
  mov    %rax,0x30(%rsp)
  mov    %rdx,0x48(%rsp)
  mov    %rdi,0x60(%rsp)
  mov    %rdi,0x68(%rsp)
  movabs $0x100000002,%rdi
  mov    %rax,0x70(%rsp)
  mov    %rax,0x78(%rsp)
  mov    %rax,0x98(%rsp)
  movabs $0x100000003,%rax
  mov    %rdx,0xa0(%rsp)
  movslq %ebx,%rdx
  shl    $0x5,%ebx
  and    $0xffffffef,%ecx
  mov    %rax,0xa8(%rsp)
  setne  %bpl
  movq   $0x0,(%rsp)
  movq   $0x0,0x8(%rsp)
  movq   $0x0,0x10(%rsp)
  movq   $0x0,0x18(%rsp)
  movl   $0x0,0x50(%rsp)
  movq   $0x3,0x80(%rsp)
  mov    %rdi,0x88(%rsp)
  movl   $0x1,0xb0(%rsp)
  movaps %xmm0,0xc0(%rsp)
  movaps %xmm0,0xd0(%rsp)
  mov    (%rsp,%rdx,4),%eax
  movaps %xmm0,0xe0(%rsp)
  movaps %xmm0,0xf0(%rsp)
  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     L63
  cmp    $0x4,%eax
  jbe    L3
L107:
  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
  add    %eax,%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>
L19:
  xor    %ebx,%ebx
  lea    D8(%rip),%r13
  lea    D24(%rip),%r14
  lea    D10(%rip),%r15
  jmp    L50
  nop
L95:
  mov    %r13,%rdi
  and    $0xf,%ebp
  call   <printf@plt>
  cmp    $0xf,%ebp
  je     L46
L6:
  add    $0x1,%rbx
  cmp    $0x100,%rbx
  je     L16
L50:
  cmpb   $0x1,(%r12,%rbx,1)
  mov    %ebx,%ebp
  jne    L95
  mov    %r14,%rdi
  and    $0xf,%ebp
  call   <printf@plt>
  cmp    $0xf,%ebp
  jne    L6
L46:
  mov    %r15,%rdi
  add    $0x1,%rbx
  call   <printf@plt>
  cmp    $0x100,%rbx
  jne    L50
L16:
  mov    0x1c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L48
  add    $0x1d8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L63:
  imul   $0x260,%eax,%eax
  lea    0xc0(%rsp),%r12
  imul   $0x2a0,%ebp,%ebp
  mov    %r12,%rdi
  add    %eax,%esi
  call   <mask_32byte@plt>
  lea    0x1300(%rbx,%rbp,1),%esi
  mov    %r12,%rdi
  call   <mask_32byte@plt>
  jmp    L19
L3:
  lea    D25(%rip),%rcx
  mov    (%rcx,%rax,4),%eax
  jmp    L107
L48:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D8
type_infered: string
name: read_data
arguments: label: D24
type_infered: string
name: read_data
arguments: label: D10
type_infered: string
name: read_data
arguments: label: D25
type_infered: string

tool: D8:   

tool: D24:  *

tool: D10: 


tool: D25: 

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