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

```asm
<morse>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xb0,%rsp
  mov    %rdi,%r14
  mov    %fs:0x28,%rax
  mov    %rax,0xa8(%rsp)
  xor    %eax,%eax
  movl   $0x202d2e61,(%rsp)
  movw   $0x2020,0x4(%rsp)
  movl   $0x2e2e2d62,0x6(%rsp)
  movw   $0x202e,0xa(%rsp)
  movl   $0x2d2e2d63,0xc(%rsp)
  movw   $0x202e,0x10(%rsp)
  movl   $0x2e2e2d64,0x12(%rsp)
  movw   $0x2020,0x16(%rsp)
  movl   $0x20202e65,0x18(%rsp)
  movw   $0x2020,0x1c(%rsp)
  movl   $0x2d2e2e66,0x1e(%rsp)
  movw   $0x202e,0x22(%rsp)
  movl   $0x2e2d2d67,0x24(%rsp)
  movw   $0x2020,0x28(%rsp)
  movl   $0x2e2e2e68,0x2a(%rsp)
  movw   $0x202e,0x2e(%rsp)
  movl   $0x202e2e69,0x30(%rsp)
  movw   $0x2020,0x34(%rsp)
  movl   $0x2d2d2e6a,0x36(%rsp)
  movw   $0x202d,0x3a(%rsp)
  movl   $0x2d2e2d6b,0x3c(%rsp)
  movw   $0x2020,0x40(%rsp)
  movl   $0x202d2d6d,0x42(%rsp)
  movw   $0x2020,0x46(%rsp)
  movl   $0x202e2d6e,0x48(%rsp)
  movw   $0x2020,0x4c(%rsp)
  movl   $0x2d2d2d6f,0x4e(%rsp)
  movw   $0x2020,0x52(%rsp)
  movl   $0x2d2d2e70,0x54(%rsp)
  movw   $0x202e,0x58(%rsp)
  movl   $0x2e2d2d71,0x5a(%rsp)
  movw   $0x202d,0x5e(%rsp)
  movl   $0x2e2d2e72,0x60(%rsp)
  movw   $0x2020,0x64(%rsp)
  movl   $0x2e2e2e73,0x66(%rsp)
  movw   $0x2020,0x6a(%rsp)
  movl   $0x20202d74,0x6c(%rsp)
  movw   $0x2020,0x70(%rsp)
  movl   $0x2e2d2e75,0x72(%rsp)
  movw   $0x2020,0x76(%rsp)
  movl   $0x2e2e2e76,0x78(%rsp)
  movw   $0x202d,0x7c(%rsp)
  movl   $0x2d2d2e77,0x7e(%rsp)
  movw   $0x2020,0x82(%rsp)
  movl   $0x2e2e2d78,0x84(%rsp)
  movw   $0x202d,0x88(%rsp)
  movl   $0x2d2e2d79,0x8a(%rsp)
  movw   $0x202d,0x8e(%rsp)
  movl   $0x2e2d2d7a,0x90(%rsp)
  movw   $0x202e,0x94(%rsp)
  movl   $0x2d2d2e31,0x96(%rsp)
  movw   $0x2d2d,0x9a(%rsp)
  movl   $0x2d2e2e32,0x9c(%rsp)
  movw   $0x2d2d,0xa0(%rsp)
  movl   $0x20202020,0xa2(%rsp)
  movw   $0x2020,0xa6(%rsp)
  lea    D2(%rip),%rdi
  call   <printf@plt>
  mov    %r14,%r12
  add    $0x8,%r14
  lea    0xad(%rsp),%r13
  jmp    L67
L12:
  add    $0x1,%rbx
  cmp    %rbp,%rbx
  je     L19
L5:
  movsbl (%r12),%edi
  call   <tolower@plt>
  cmp    -0x5(%rbp),%al
  jne    L12
  movsbl 0x1(%rbx),%edi
  call   <putchar@plt>
  jmp    L12
L19:
  add    $0x6,%rbp
  cmp    %r13,%rbp
  je     L24
L27:
  lea    -0x5(%rbp),%rbx
  jmp    L5
L24:
  mov    $0x20,%edi
  call   <putchar@plt>
  add    $0x1,%r12
  cmp    %r14,%r12
  je     L42
L67:
  lea    0x5(%rsp),%rbp
  jmp    L27
L42:
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L62
  add    $0xb0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L62:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: data_tag: D2
type_guessed: string

tool: D2: La frase escrita en codigo morse es: 

assistant: ```c
void morse(char palabra[]) {
  char M[28][6] = {{'a', '.', '-', ' ', ' ', ' '}, {'b', '-', '.', '.', '.', ' '}, {'c', '-', '.', '-', '.', ' '}, {'d', '-', '.', '.', ' ', ' '}, {'e', '.', ' ', ' ', ' ', ' '}, {'f', '.', '.', '-', '.', ' '}, {'g', '-', '-', '.', ' ', ' '}, {'h', '.', '.', '.', '.', ' '}, {'i', '.', '.', ' ', ' ', ' '}, {'j', '.', '-', '-', '-', ' '}, {'k', '-', '.', '-', ' ', ' '}, {'m', '-', '-', ' ', ' ', ' '}, {'n', '-', '.', ' ', ' ', ' '}, {'o', '-', '-', '-', ' ', ' '}, {'p', '.', '-', '-', '.', ' '}, {'q', '-', '-', '.', '-', ' '}, {'r', '.', '-', '.', ' ', ' '}, {'s', '.', '.', '.', ' ', ' '}, {'t', '-', ' ', ' ', ' ', ' '}, {'u', '.', '-', '.', ' ', ' '}, {'v', '.', '.', '.', '-', ' '}, {'w', '.', '-', '-', ' ', ' '}, {'x', '-', '.', '.', '-', ' '}, {'y', '-', '.', '-', '-', ' '}, {'z', '-', '-', '.', '.', ' '}, {'1', '.', '-', '-', '-', '-'}, {'2', '.', '.', '-', '-', '-'}, {' ', ' ', ' ', ' ', ' ', ' '}};
  int i, j, k;
  printf("La frase escrita en codigo morse es: ");
  for (k = 0; k < (sizeof(palabra) / sizeof(palabra[0])); k++) {
    for (i = 0; i < 28; i++) {
      for (j = 1; j < 6; j++) {
        if (tolower(palabra[k]) == M[i][0]) {
          printf("%c", M[i][j]);
        }
      }
    }
    printf(" ");
  }
}
```