user: Converte this assembly snippet into its equivalent C code:

```asm
<character>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8d,%ecx
  mov    %r9d,%esi
  mov    0x10(%rbp),%edx
  mov    0x18(%rbp),%eax
  mov    %cl,-0x34(%rbp)
  mov    %esi,%ecx
  mov    %cl,-0x38(%rbp)
  mov    %dl,-0x3c(%rbp)
  mov    %al,-0x40(%rbp)
  movb   $0x0,-0x2(%rbp)
  movzbl -0x40(%rbp),%eax
  mov    %al,-0x1(%rbp)
  movzbl -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movb   $0x0,-0x2(%rbp)
  jmp    L74
L16:
  movzbl -0x2(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  addb   $0x1,-0x2(%rbp)
L74:
  cmpb   $0x7,-0x2(%rbp)
  jbe    L16
  movzbl -0x34(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movzbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  addb   $0x8,-0x3c(%rbp)
  addb   $0x1,-0x1(%rbp)
  addb   $0x1,-0x34(%rbp)
  movzbl -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movb   $0x0,-0x2(%rbp)
  jmp    L46
L8:
  movzbl -0x2(%rbp),%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  addb   $0x1,-0x2(%rbp)
L46:
  cmpb   $0x7,-0x2(%rbp)
  jbe    L8
  movzbl -0x34(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movzbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  addb   $0x8,-0x3c(%rbp)
  addb   $0x1,-0x1(%rbp)
  movzbl -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movb   $0x0,-0x2(%rbp)
  jmp    L41
L32:
  movzbl -0x2(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  addb   $0x1,-0x2(%rbp)
L41:
  cmpb   $0x7,-0x2(%rbp)
  jbe    L32
  movzbl -0x38(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movzbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  addb   $0x8,-0x3c(%rbp)
  addb   $0x1,-0x1(%rbp)
  addb   $0x1,-0x38(%rbp)
  movzbl -0x3c(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movb   $0x0,-0x2(%rbp)
  jmp    L42
L17:
  movzbl -0x2(%rbp),%edx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  addb   $0x1,-0x2(%rbp)
L42:
  cmpb   $0x7,-0x2(%rbp)
  jbe    L17
  movzbl -0x38(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteCommand@plt>
  movzbl -0x1(%rbp),%eax
  mov    %eax,%edi
  call   <LCD_WriteData@plt>
  mov    $0xa,%edi
  call   <delay_ms@plt>
  mov    $0x0,%edi
  call   <LCD_Cursor@plt>
  nop
  leave
  ret
```

assistant: ```c
void character(unsigned char TL[], unsigned char TR[], unsigned char BL[], unsigned char BR[], unsigned char L1, unsigned char L2, unsigned char SA, unsigned char DN) {
  unsigned char index = 0;
  unsigned char displayNumber = DN;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(TL[index]);
  LCD_WriteCommand(L1);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  ++L1;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(TR[index]);
  LCD_WriteCommand(L1);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(BL[index]);
  LCD_WriteCommand(L2);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  SA += 0x08;
  ++displayNumber;
  ++L2;
  LCD_WriteCommand(SA);
  for (index = 0; index < 8; ++index)
    LCD_WriteData(BR[index]);
  LCD_WriteCommand(L2);
  LCD_WriteData(displayNumber);
  delay_ms(10);
  LCD_Cursor(0);
}
```