user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x4e8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x34d8(%rsp)
  xor    %eax,%eax
  movb   $0x53,0x40(%rsp)
  movb   $0x48,0x41(%rsp)
  movb   $0x45,0x42(%rsp)
  movb   $0x4c,0x43(%rsp)
  movb   $0x4c,0x44(%rsp)
  movb   $0x3e,0x45(%rsp)
  movb   $0x20,0x46(%rsp)
  movb   $0x0,0x47(%rsp)
  movb   $0x74,0x22(%rsp)
  movb   $0x79,0x23(%rsp)
  movb   $0x70,0x24(%rsp)
  movb   $0x65,0x25(%rsp)
  movb   $0x20,0x26(%rsp)
  movb   $0x0,0x27(%rsp)
  movb   $0x68,0x3a(%rsp)
  movb   $0x65,0x3b(%rsp)
  movb   $0x6c,0x3c(%rsp)
  movb   $0x70,0x3d(%rsp)
  movb   $0xd,0x3e(%rsp)
  movb   $0x0,0x3f(%rsp)
  movb   $0x65,0x58(%rsp)
  movb   $0x78,0x59(%rsp)
  movb   $0x65,0x5a(%rsp)
  movb   $0x63,0x5b(%rsp)
  movb   $0x75,0x5c(%rsp)
  movb   $0x74,0x5d(%rsp)
  movb   $0x65,0x5e(%rsp)
  movb   $0x20,0x5f(%rsp)
  movb   $0x0,0x60(%rsp)
  movb   $0x65,0x28(%rsp)
  movb   $0x78,0x29(%rsp)
  movb   $0x69,0x2a(%rsp)
  movb   $0x74,0x2b(%rsp)
  movb   $0xd,0x2c(%rsp)
  movb   $0x0,0x2d(%rsp)
  movb   $0x64,0x48(%rsp)
  movb   $0x65,0x49(%rsp)
  movb   $0x6c,0x4a(%rsp)
  movb   $0x65,0x4b(%rsp)
  movb   $0x74,0x4c(%rsp)
  movb   $0x65,0x4d(%rsp)
  movb   $0x20,0x4e(%rsp)
  movb   $0x0,0x4f(%rsp)
  movb   $0x63,0x2e(%rsp)
  movb   $0x6f,0x2f(%rsp)
  movb   $0x70,0x30(%rsp)
  movb   $0x79,0x31(%rsp)
  movb   $0x20,0x32(%rsp)
  movb   $0x0,0x33(%rsp)
  movb   $0x64,0x10(%rsp)
  movb   $0x69,0x11(%rsp)
  movb   $0x72,0x12(%rsp)
  movb   $0xd,0x13(%rsp)
  movb   $0x63,0x50(%rsp)
  movb   $0x72,0x51(%rsp)
  movb   $0x65,0x52(%rsp)
  movb   $0x61,0x53(%rsp)
  movb   $0x74,0x54(%rsp)
  movb   $0x65,0x55(%rsp)
  movb   $0x20,0x56(%rsp)
  movb   $0x0,0x57(%rsp)
  movb   $0x42,0x61(%rsp)
  movb   $0x61,0x62(%rsp)
  movb   $0x64,0x63(%rsp)
  movb   $0x20,0x64(%rsp)
  movb   $0x43,0x65(%rsp)
  movb   $0x6f,0x66(%rsp)
  movb   $0x6d,0x67(%rsp)
  movb   $0x6d,0x68(%rsp)
  movb   $0x61,0x69(%rsp)
  movb   $0x6e,0x6a(%rsp)
  movb   $0x64,0x6b(%rsp)
  movb   $0x21,0x6c(%rsp)
  movb   $0xd,0x6d(%rsp)
  movb   $0xa,0x6e(%rsp)
  movb   $0x0,0x6f(%rsp)
  movb   $0xd,0xd(%rsp)
  movb   $0xa,0xe(%rsp)
  movb   $0x0,0xf(%rsp)
  movb   $0x63,0x14(%rsp)
  movb   $0x6c,0x15(%rsp)
  movb   $0x73,0x16(%rsp)
  movb   $0xd,0x17(%rsp)
  movb   $0x6b,0x34(%rsp)
  movb   $0x69,0x35(%rsp)
  movb   $0x6c,0x36(%rsp)
  movb   $0x6c,0x37(%rsp)
  movb   $0x20,0x38(%rsp)
  movb   $0x0,0x39(%rsp)
  movb   $0x63,0x18(%rsp)
  movb   $0x62,0x19(%rsp)
  movb   $0x67,0x1a(%rsp)
  movb   $0x20,0x1b(%rsp)
  movb   $0x0,0x1c(%rsp)
  movb   $0x63,0x1d(%rsp)
  movb   $0x66,0x1e(%rsp)
  movb   $0x67,0x1f(%rsp)
  movb   $0x20,0x20(%rsp)
  movb   $0x0,0x21(%rsp)
  movb   $0x65,0x70(%rsp)
  movb   $0x78,0x71(%rsp)
  movb   $0x65,0x72(%rsp)
  movb   $0x63,0x73(%rsp)
  movb   $0x66,0x74(%rsp)
  movb   $0x6f,0x75(%rsp)
  movb   $0x72,0x76(%rsp)
  movb   $0x65,0x77(%rsp)
  movb   $0x67,0x78(%rsp)
  movb   $0x72,0x79(%rsp)
  movb   $0x6f,0x7a(%rsp)
  movb   $0x75,0x7b(%rsp)
  movb   $0x6e,0x7c(%rsp)
  movb   $0x64,0x7d(%rsp)
  movb   $0x20,0x7e(%rsp)
  movb   $0x0,0x7f(%rsp)
  call   <enableInterrupts@plt>
  lea    0x40(%rsp),%r12
  jmp    L132
L117:
  lea    0x58(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x8,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L15
  lea    0x28(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x5,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L165
  lea    0x48(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x7,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L276
  lea    0x2e(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x5,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L192
  lea    0x10(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x4,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L109
  lea    0x18(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x4,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L98
  lea    0x1d(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x4,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L77
  lea    0x14(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x4,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L136
  lea    0x50(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x7,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L264
  lea    0x34(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x5,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L160
  lea    0x70(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0xf,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L263
  lea    0x3a(%rsp),%rsi
  lea    0x80(%rsp),%rdi
  mov    $0x5,%edx
  call   <strncmp@plt>
  test   %eax,%eax
  je     L285
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0xf,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L15:
  lea    0x88(%rsp),%rbx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x4,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
L132:
  movb   $0x0,0x80(%rsp)
  movb   $0x0,0xd0(%rsp)
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %r12,%rdx
  mov    $0x0,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  lea    0x80(%rsp),%rbx
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x1,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  lea    0x22(%rsp),%rsi
  mov    $0x5,%edx
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L117
  lea    0x85(%rsp),%rbp
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  lea    0xd0(%rsp),%rbx
  mov    $0x0,%r8d
  mov    %rbx,%rcx
  mov    %rbp,%rdx
  mov    $0x3,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x0,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L165:
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x5,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L276:
  lea    0x87(%rsp),%rbx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x7,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L192:
  lea    0x85(%rsp),%rbx
  mov    $0x20,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <indexOf@plt>
  cltq
  lea    0x1(%rbx,%rax,1),%rbp
  mov    $0x20,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <indexOf@plt>
  cltq
  movb   $0x0,0x85(%rsp,%rax,1)
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  mov    %rbp,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  lea    0xd0(%rsp),%r13
  mov    $0x0,%r8d
  mov    %r13,%rcx
  mov    %rbx,%rdx
  mov    $0x3,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  lea    0x8(%rsp),%rcx
  mov    $0x0,%r8d
  mov    %rbx,%rdx
  mov    $0x63,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  mov    0x8(%rsp),%r8d
  mov    %r13,%rcx
  mov    %rbp,%rdx
  mov    $0x8,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L109:
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x9,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L98:
  movsbl 0x84(%rsp),%edx
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0xd,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L77:
  movsbl 0x86(%rsp),%ecx
  movsbl 0x84(%rsp),%edx
  mov    $0x0,%r8d
  mov    $0xc,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L136:
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0xa,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L264:
  lea    0x87(%rsp),%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  mov    $0x0,%ebp
  lea    0xd0(%rsp),%r13
L197:
  mov    %ebp,%ebx
  add    %r13,%rbx
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0x1,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  lea    0xd(%rsp),%rsi
  mov    $0x3,%edx
  mov    %rbx,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L139
  mov    %rbx,%rdi
  call   <strlen@plt>
  add    %eax,%ebp
  jmp    L197
L139:
  mov    %ebp,%ebp
  movb   $0x0,0xd0(%rsp,%rbp,1)
  lea    0xd0(%rsp),%rbx
  mov    %rbx,%rdi
  call   <strlen@plt>
  shr    $0x9,%rax
  lea    0x87(%rsp),%rdx
  lea    0x1(%rax),%r8
  mov    %rbx,%rcx
  mov    $0x8,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L160:
  movsbl 0x85(%rsp),%edx
  sub    $0x30,%edx
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0xb,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L263:
  lea    0x8f(%rsp),%rbx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <cleanFilename@plt>
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    %rbx,%rdx
  mov    $0xe,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
L285:
  lea    0x61(%rsp),%rdx
  mov    $0x0,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%esi
  mov    $0x21,%edi
  mov    $0x0,%eax
  call   <interrupt@plt>
  jmp    L132
```

assistant: ```c
int main() {
  char buffer[80];
  char *filename1, *filename2, *filename3, *filename4, *processToKill;
  char fileContentBuffer[13312];
  char prompt[8], type[6], execute[9], exit[6], delete[8], copy[6], dir[4], create[8], errorMsg[15], newline[3], clear[4], kill[6], changeBG[5], changeFG[5], execforeground[16], help[6];
  unsigned int i;
  int numSectors;
  prompt[0] = 'S';
  prompt[1] = 'H';
  prompt[2] = 'E';
  prompt[3] = 'L';
  prompt[4] = 'L';
  prompt[5] = '>';
  prompt[6] = ' ';
  prompt[7] = '\0';
  type[0] = 't';
  type[1] = 'y';
  type[2] = 'p';
  type[3] = 'e';
  type[4] = ' ';
  type[5] = '\0';
  help[0] = 'h';
  help[1] = 'e';
  help[2] = 'l';
  help[3] = 'p';
  help[4] = '\r';
  help[5] = '\0';
  execute[0] = 'e';
  execute[1] = 'x';
  execute[2] = 'e';
  execute[3] = 'c';
  execute[4] = 'u';
  execute[5] = 't';
  execute[6] = 'e';
  execute[7] = ' ';
  execute[8] = '\0';
  exit[0] = 'e';
  exit[1] = 'x';
  exit[2] = 'i';
  exit[3] = 't';
  exit[4] = '\r';
  exit[5] = '\0';
  delete[0] = 'd';
  delete[1] = 'e';
  delete[2] = 'l';
  delete[3] = 'e';
  delete[4] = 't';
  delete[5] = 'e';
  delete[6] = ' ';
  delete[7] = '\0';
  copy[0] = 'c';
  copy[1] = 'o';
  copy[2] = 'p';
  copy[3] = 'y';
  copy[4] = ' ';
  copy[5] = '\0';
  dir[0] = 'd';
  dir[1] = 'i';
  dir[2] = 'r';
  dir[3] = '\r';
  create[0] = 'c';
  create[1] = 'r';
  create[2] = 'e';
  create[3] = 'a';
  create[4] = 't';
  create[5] = 'e';
  create[6] = ' ';
  create[7] = '\0';
  errorMsg[0] = 'B';
  errorMsg[1] = 'a';
  errorMsg[2] = 'd';
  errorMsg[3] = ' ';
  errorMsg[4] = 'C';
  errorMsg[5] = 'o';
  errorMsg[6] = 'm';
  errorMsg[7] = 'm';
  errorMsg[8] = 'a';
  errorMsg[9] = 'n';
  errorMsg[10] = 'd';
  errorMsg[11] = '!';
  errorMsg[12] = '\r';
  errorMsg[13] = '\n';
  errorMsg[14] = '\0';
  newline[0] = '\r';
  newline[1] = '\n';
  newline[2] = '\0';
  clear[0] = 'c';
  clear[1] = 'l';
  clear[2] = 's';
  clear[3] = '\r';
  kill[0] = 'k';
  kill[1] = 'i';
  kill[2] = 'l';
  kill[3] = 'l';
  kill[4] = ' ';
  kill[5] = '\0';
  changeBG[0] = 'c';
  changeBG[1] = 'b';
  changeBG[2] = 'g';
  changeBG[3] = ' ';
  changeBG[4] = '\0';
  changeFG[0] = 'c';
  changeFG[1] = 'f';
  changeFG[2] = 'g';
  changeFG[3] = ' ';
  changeFG[4] = '\0';
  execforeground[0] = 'e';
  execforeground[1] = 'x';
  execforeground[2] = 'e';
  execforeground[3] = 'c';
  execforeground[4] = 'f';
  execforeground[5] = 'o';
  execforeground[6] = 'r';
  execforeground[7] = 'e';
  execforeground[8] = 'g';
  execforeground[9] = 'r';
  execforeground[10] = 'o';
  execforeground[11] = 'u';
  execforeground[12] = 'n';
  execforeground[13] = 'd';
  execforeground[14] = ' ';
  execforeground[15] = '\0';
  enableInterrupts();
  while (1) {
    buffer[0] = '\0';
    filename1 = 0;
    fileContentBuffer[0] = '\0';
    interrupt(0x21, 0, prompt, 0, 0);
    interrupt(0x21, 1, buffer, 0, 0);
    if (strncmp(buffer, type, 5)) {
      filename1 = buffer + 5;
      cleanFilename(filename1);
      interrupt(0x21, 3, filename1, fileContentBuffer, 0);
      interrupt(0x21, 0, fileContentBuffer, 0, 0);
    } else if (strncmp(buffer, execute, 8)) {
      filename1 = buffer + 8;
      cleanFilename(filename1);
      interrupt(0x21, 4, filename1, 0, 0);
    } else if (strncmp(buffer, exit, 5)) {
      interrupt(0x21, 5, 0, 0, 0);
    } else if (strncmp(buffer, delete, 7)) {
      filename1 = buffer + 7;
      cleanFilename(filename1);
      interrupt(0x21, 7, filename1, 0, 0);
    } else if (strncmp(buffer, copy, 5)) {
      filename1 = buffer + 5;
      filename2 = filename1 + indexOf(filename1, ' ') + 1;
      filename1[indexOf(filename1, ' ')] = '\0';
      cleanFilename(filename1);
      cleanFilename(filename2);
      interrupt(0x21, 3, filename1, fileContentBuffer, 0);
      interrupt(0x21, 99, filename1, &numSectors, 0);
      interrupt(0x21, 8, filename2, fileContentBuffer, numSectors);
    } else if (strncmp(buffer, dir, 4)) {
      interrupt(0x21, 9, 0, 0, 0);
    } else if (strncmp(buffer, changeBG, 4)) {
      interrupt(0x21, 13, buffer[4], 0, 0);
    } else if (strncmp(buffer, changeFG, 4)) {
      interrupt(0x21, 12, buffer[4], buffer[6], 0);
    } else if (strncmp(buffer, clear, 4)) {
      interrupt(0x21, 10, 0, 0, 0);
    } else if (strncmp(buffer, create, 7)) {
      filename1 = buffer + 7;
      cleanFilename(filename1);
      i = 0;
      while (1) {
        interrupt(0x21, 1, fileContentBuffer + i, 0, 0);
        if (strncmp(fileContentBuffer + i, newline, 3)) {
          fileContentBuffer[i] = '\0';
          break;
        } else {
          i += strlen(fileContentBuffer + i);
        }
      }
      interrupt(0x21, 8, filename1, fileContentBuffer, strlen(fileContentBuffer) / 512 + 1);
    } else if (strncmp(buffer, kill, 5)) {
      interrupt(0x21, 11, ((int)buffer[5] - 0x30), 0, 0);
    } else if (strncmp(buffer, execforeground, 15)) {
      filename1 = buffer + 15;
      cleanFilename(filename1);
      interrupt(0x21, 14, filename1, 0, 0);
    } else if (strncmp(buffer, help, 5)) {
      interrupt(0x21, 15, 0, 0, 0);
    } else {
      interrupt(0x21, 0, errorMsg, 0, 0);
    }
  }
  return 0;
}
```