user: Demonstrate the C code that generates the assembly output below:

```asm
<handleInterrupt21>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %esi,-0x38(%rbp)
  mov    %edx,-0x3c(%rbp)
  mov    %ecx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpl   $0x5,-0x34(%rbp)
  ja     L63
  mov    -0x34(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D11(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D11(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x38(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <printString@plt>
  jmp    L34
  mov    -0x38(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <readString@plt>
  jmp    L34
  mov    -0x3c(%rbp),%edx
  mov    -0x38(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <readSector@plt>
  jmp    L34
  mov    -0x3c(%rbp),%edx
  mov    -0x38(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <readFile@plt>
  jmp    L34
  mov    -0x3c(%rbp),%edx
  mov    -0x38(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <executeProgram@plt>
  jmp    L34
  mov    $0x0,%eax
  call   <terminate@plt>
  jmp    L34
L63:
  movb   $0x45,-0x30(%rbp)
  movb   $0x72,-0x2f(%rbp)
  movb   $0x72,-0x2e(%rbp)
  movb   $0x6f,-0x2d(%rbp)
  movb   $0x72,-0x2c(%rbp)
  movb   $0x3a,-0x2b(%rbp)
  movb   $0x20,-0x2a(%rbp)
  movb   $0x77,-0x29(%rbp)
  movb   $0x68,-0x28(%rbp)
  movb   $0x61,-0x27(%rbp)
  movb   $0x74,-0x26(%rbp)
  movb   $0x20,-0x25(%rbp)
  movb   $0x64,-0x24(%rbp)
  movb   $0x69,-0x23(%rbp)
  movb   $0x64,-0x22(%rbp)
  movb   $0x20,-0x21(%rbp)
  movb   $0x79,-0x20(%rbp)
  movb   $0x6f,-0x1f(%rbp)
  movb   $0x75,-0x1e(%rbp)
  movb   $0x20,-0x1d(%rbp)
  movb   $0x63,-0x1c(%rbp)
  movb   $0x61,-0x1b(%rbp)
  movb   $0x6c,-0x1a(%rbp)
  movb   $0x6c,-0x19(%rbp)
  movb   $0x20,-0x18(%rbp)
  movb   $0x69,-0x17(%rbp)
  movb   $0x74,-0x16(%rbp)
  movb   $0x20,-0x15(%rbp)
  movb   $0x77,-0x14(%rbp)
  movb   $0x69,-0x13(%rbp)
  movb   $0x74,-0x12(%rbp)
  movb   $0x68,-0x11(%rbp)
  movb   $0x3f,-0x10(%rbp)
  movb   $0xd,-0xf(%rbp)
  movb   $0xa,-0xe(%rbp)
  movb   $0x0,-0xd(%rbp)
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printString@plt>
L34:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L41
  call   <__stack_chk_fail@plt>
L41:
  leave
  ret
```

assistant: ```c
void handleInterrupt21(int ax, int bx, int cx, int dx) {
  char errorMsg[36];
  switch (ax) {
  case 0:
    printString(bx);
    break;
  case 1:
    readString(bx);
    break;
  case 2:
    readSector(bx, cx);
    break;
  case 3:
    readFile(bx, cx);
    break;
  case 4:
    executeProgram(bx, cx);
    break;
  case 5:
    terminate();
    break;
  default:
    errorMsg[0] = 'E';
    errorMsg[1] = 'r';
    errorMsg[2] = 'r';
    errorMsg[3] = 'o';
    errorMsg[4] = 'r';
    errorMsg[5] = ':';
    errorMsg[6] = ' ';
    errorMsg[7] = 'w';
    errorMsg[8] = 'h';
    errorMsg[9] = 'a';
    errorMsg[10] = 't';
    errorMsg[11] = ' ';
    errorMsg[12] = 'd';
    errorMsg[13] = 'i';
    errorMsg[14] = 'd';
    errorMsg[15] = ' ';
    errorMsg[16] = 'y';
    errorMsg[17] = 'o';
    errorMsg[18] = 'u';
    errorMsg[19] = ' ';
    errorMsg[20] = 'c';
    errorMsg[21] = 'a';
    errorMsg[22] = 'l';
    errorMsg[23] = 'l';
    errorMsg[24] = ' ';
    errorMsg[25] = 'i';
    errorMsg[26] = 't';
    errorMsg[27] = ' ';
    errorMsg[28] = 'w';
    errorMsg[29] = 'i';
    errorMsg[30] = 't';
    errorMsg[31] = 'h';
    errorMsg[32] = '?';
    errorMsg[33] = '\r';
    errorMsg[34] = '\n';
    errorMsg[35] = '\0';
    printString(errorMsg);
  }
}
```