user: Translate the below assembly code into C programming language:

```asm
<decode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L114
L20:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jne    L40
  mov    -0x24(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L62
L40:
  addl   $0x1,-0x24(%rbp)
L114:
  cmpl   $0xff,-0x24(%rbp)
  jle    L20
L62:
  movl   $0x0,-0x24(%rbp)
  jmp    L55
L56:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0xa,-0x10(%rbp)
  je     L80
  cmpl   $0x60,-0x10(%rbp)
  jle    L15
  cmpl   $0x7a,-0x10(%rbp)
  jg     L15
  movl   $0x61,-0x1c(%rbp)
  movl   $0x7a,-0x20(%rbp)
  jmp    L6
L15:
  cmpl   $0x40,-0x10(%rbp)
  jle    L128
  cmpl   $0x5a,-0x10(%rbp)
  jg     L128
  movl   $0x41,-0x1c(%rbp)
  movl   $0x5a,-0x20(%rbp)
  jmp    L6
L128:
  movl   $0x0,-0x20(%rbp)
  addl   $0x1,-0x14(%rbp)
L6:
  mov    -0x24(%rbp),%eax
  sub    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %edx,%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x25(%rbp)
  movsbl -0x25(%rbp),%eax
  mov    %eax,%edi
  call   <toUpperCase@plt>
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  sub    $0x41,%eax
  mov    %eax,-0x8(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  je     L65
  mov    -0x20(%rbp),%eax
  sub    -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jle    L33
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edi
  call   <putchar@plt>
  jmp    L90
L33:
  mov    -0x10(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edi
  call   <putchar@plt>
  jmp    L90
L65:
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <putchar@plt>
L90:
  addl   $0x1,-0x24(%rbp)
L55:
  cmpl   $0xff,-0x24(%rbp)
  jle    L56
  jmp    L159
L80:
  nop
L159:
  mov    $0xa,%edi
  call   <putchar@plt>
  nop
  leave
  ret
```

assistant: ```c
void decode(char *text, char *key) {
  int i;
  int nChar;
  int k;
  int offset;
  int upperBound;
  int lowerBound;
  int nKeyChar;
  char keyChar;
  int keyLength = 0;
  int notLetter = 0;
  for (i = 0; i <= 255; i++) {
    nChar = key[i];
    if (nChar == 0) {
      keyLength = i;
      break;
    }
  }
  for (i = 0; i < 256; i++) {
    nChar = text[i];
    if (nChar == 10) {
      break;
    }
    if (nChar >= 97 && nChar <= 122) {
      lowerBound = 97;
      upperBound = 122;
    } else if (nChar >= 65 && nChar <= 90) {
      lowerBound = 65;
      upperBound = 90;
    } else {
      upperBound = 0;
      notLetter++;
    }
    keyChar = key[(i - notLetter) % keyLength];
    nKeyChar = toUpperCase(keyChar);
    k = nKeyChar - 65;
    if (upperBound) {
      offset = k - (upperBound - nChar);
      if (offset > 0) {
        printf("%c", (lowerBound - 1 + offset));
      } else {
        printf("%c", (nChar + k));
      }
    } else {
      printf("%c", nChar);
    }
  }
  printf("\n");
}
```