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

```asm
<lm_create_hash>:
  endbr64
  push   %r15
  mov    $0x7,%edx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  xor    %esi,%esi
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x38,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  movabs $0x252423402153474b,%rax
  lea    0x1(%rsp),%r12
  lea    0x8(%rsp),%r14
  movb   $0x0,0x27(%rsp)
  mov    %r12,%rdi
  mov    %rax,0x1f(%rsp)
  call   <memset@plt>
  xor    %esi,%esi
  mov    %r14,%rdi
  mov    $0x7,%edx
  call   <memset@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  test   %rax,%rax
  jne    L33
L80:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x1,%rax
  ja     L192
L128:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x2,%rax
  ja     L107
L189:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x3,%rax
  ja     L60
L81:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x4,%rax
  ja     L28
L99:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x5,%rax
  ja     L61
L38:
  mov    %rbx,%rdi
  call   <strlen@plt>
  cmp    $0x6,%rax
  ja     L37
L89:
  lea    0xf(%rsp),%r13
  lea    0x1f(%rsp),%r15
  mov    %r12,%rdi
  mov    %r13,%rdx
  mov    %r15,%rsi
  lea    0x17(%rsp),%r12
  call   <des@plt>
  mov    %r12,%rdx
  mov    %r15,%rsi
  mov    %r14,%rdi
  call   <des@plt>
  mov    $0x8,%edx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <memcpy@plt>
  lea    0x8(%rbp),%rdi
  mov    $0x8,%edx
  mov    %r12,%rsi
  call   <memcpy@plt>
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L140
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L33:
  movsbl (%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x1(%rsp)
  call   <strlen@plt>
  cmp    $0x7,%rax
  jbe    L80
  movsbl 0x7(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x8(%rsp)
  call   <strlen@plt>
  cmp    $0x1,%rax
  jbe    L128
L192:
  movsbl 0x1(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x2(%rsp)
  call   <strlen@plt>
  cmp    $0x8,%rax
  jbe    L128
  movsbl 0x8(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x9(%rsp)
  call   <strlen@plt>
  cmp    $0x2,%rax
  jbe    L189
L107:
  movsbl 0x2(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x3(%rsp)
  call   <strlen@plt>
  cmp    $0x9,%rax
  jbe    L189
  movsbl 0x9(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0xa(%rsp)
  call   <strlen@plt>
  cmp    $0x3,%rax
  jbe    L81
L60:
  movsbl 0x3(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x4(%rsp)
  call   <strlen@plt>
  cmp    $0xa,%rax
  jbe    L81
  movsbl 0xa(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0xb(%rsp)
  call   <strlen@plt>
  cmp    $0x4,%rax
  jbe    L99
L28:
  movsbl 0x4(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x5(%rsp)
  call   <strlen@plt>
  cmp    $0xb,%rax
  jbe    L99
  movsbl 0xb(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0xc(%rsp)
  call   <strlen@plt>
  cmp    $0x5,%rax
  jbe    L38
L61:
  movsbl 0x5(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x6(%rsp)
  call   <strlen@plt>
  cmp    $0xc,%rax
  jbe    L38
  movsbl 0xc(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0xd(%rsp)
  call   <strlen@plt>
  cmp    $0x6,%rax
  jbe    L89
L37:
  movsbl 0x6(%rbx),%edi
  call   <toupper@plt>
  mov    %rbx,%rdi
  mov    %al,0x7(%rsp)
  call   <strlen@plt>
  cmp    $0xd,%rax
  jbe    L89
  movsbl 0xd(%rbx),%edi
  call   <toupper@plt>
  mov    %al,0xe(%rsp)
  jmp    L89
L140:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void lm_create_hash(const char *password, uint8_t result[16]) {
  size_t i;
  uint8_t password1[7];
  uint8_t password2[7];
  uint8_t kgs[] = "KGS!@#$%";
  uint8_t hash1[8];
  uint8_t hash2[8];
  memset(password1, 0, 7);
  memset(password2, 0, 7);
  for (i = 0; i < 7; i++) {
    if (i < strlen(password))
      password1[i] = toupper(password[i]);
    if (i + 7 < strlen(password))
      password2[i] = toupper(password[i + 7]);
  }
  des(password1, kgs, hash1);
  des(password2, kgs, hash2);
  memcpy(result + 0, hash1, 8);
  memcpy(result + 8, hash2, 8);
}
```