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

```asm
<morse>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  lea    D72(%rip),%rdi
  push   %rbp
  lea    0x8(%r12),%r15
  push   %rbx
  sub    $0xb8,%rsp
  movdqa D100(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0xa8(%rsp)
  xor    %eax,%eax
  lea    0x5(%rsp),%r14
  lea    0xad(%rsp),%r13
  movabs $0x2020202020202d2d,%rax
  movaps %xmm0,(%rsp)
  movdqa D79(%rip),%xmm0
  mov    %rax,0xa0(%rsp)
  xor    %eax,%eax
  movaps %xmm0,0x10(%rsp)
  movdqa D88(%rip),%xmm0
  movaps %xmm0,0x20(%rsp)
  movdqa D92(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  movdqa D29(%rip),%xmm0
  movaps %xmm0,0x40(%rsp)
  movdqa D20(%rip),%xmm0
  movaps %xmm0,0x50(%rsp)
  movdqa D47(%rip),%xmm0
  movaps %xmm0,0x60(%rsp)
  movdqa D102(%rip),%xmm0
  movaps %xmm0,0x70(%rsp)
  movdqa D46(%rip),%xmm0
  movaps %xmm0,0x80(%rsp)
  movdqa D84(%rip),%xmm0
  movaps %xmm0,0x90(%rsp)
  call   <printf@plt>
L20:
  mov    %r14,%rbp
  nopw   0x0(%rax,%rax,1)
L57:
  lea    -0x5(%rbp),%rbx
L22:
  movsbl (%r12),%edi
  call   <tolower@plt>
  cmp    -0x5(%rbp),%al
  je     L18
L32:
  add    $0x1,%rbx
  cmp    %rbp,%rbx
  jne    L22
  lea    0x6(%rbx),%rbp
  cmp    %r13,%rbp
  jne    L57
  mov    $0x20,%edi
  add    $0x1,%r12
  call   <putchar@plt>
  cmp    %r15,%r12
  jne    L20
  mov    0xa8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L6
  add    $0xb8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L18:
  movsbl 0x1(%rbx),%edi
  call   <putchar@plt>
  jmp    L32
L6:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D72
datatype: string
name: retrieve_data
arguments: data_label: D100
datatype: byte[16]
name: retrieve_data
arguments: data_label: D79
datatype: byte[16]
name: retrieve_data
arguments: data_label: D88
datatype: byte[16]
name: retrieve_data
arguments: data_label: D92
datatype: byte[16]
name: retrieve_data
arguments: data_label: D29
datatype: byte[16]
name: retrieve_data
arguments: data_label: D20
datatype: byte[16]
name: retrieve_data
arguments: data_label: D47
datatype: byte[16]
name: retrieve_data
arguments: data_label: D102
datatype: byte[16]
name: retrieve_data
arguments: data_label: D46
datatype: byte[16]
name: retrieve_data
arguments: data_label: D84
datatype: byte[16]

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

tool: {"D100": [0x61,0x2e,0x2d,0x20,0x20,0x20,0x62,0x2d,0x2e,0x2e,0x2e,0x20,0x63,0x2d,0x2e,0x2d]}

tool: {"D79": [0x2e,0x20,0x64,0x2d,0x2e,0x2e,0x20,0x20,0x65,0x2e,0x20,0x20,0x20,0x20,0x66,0x2e]}

tool: {"D88": [0x2e,0x2d,0x2e,0x20,0x67,0x2d,0x2d,0x2e,0x20,0x20,0x68,0x2e,0x2e,0x2e,0x2e,0x20]}

tool: {"D92": [0x69,0x2e,0x2e,0x20,0x20,0x20,0x6a,0x2e,0x2d,0x2d,0x2d,0x20,0x6b,0x2d,0x2e,0x2d]}

tool: {"D29": [0x20,0x20,0x6d,0x2d,0x2d,0x20,0x20,0x20,0x6e,0x2d,0x2e,0x20,0x20,0x20,0x6f,0x2d]}

tool: {"D20": [0x2d,0x2d,0x20,0x20,0x70,0x2e,0x2d,0x2d,0x2e,0x20,0x71,0x2d,0x2d,0x2e,0x2d,0x20]}

tool: {"D47": [0x72,0x2e,0x2d,0x2e,0x20,0x20,0x73,0x2e,0x2e,0x2e,0x20,0x20,0x74,0x2d,0x20,0x20]}

tool: {"D102": [0x20,0x20,0x75,0x2e,0x2d,0x2e,0x20,0x20,0x76,0x2e,0x2e,0x2e,0x2d,0x20,0x77,0x2e]}

tool: {"D46": [0x2d,0x2d,0x20,0x20,0x78,0x2d,0x2e,0x2e,0x2d,0x20,0x79,0x2d,0x2e,0x2d,0x2d,0x20]}

tool: {"D84": [0x7a,0x2d,0x2d,0x2e,0x2e,0x20,0x31,0x2e,0x2d,0x2d,0x2d,0x2d,0x32,0x2e,0x2e,0x2d]}

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(" ");
  }
}
```