user: 请将以下的汇编代码转换成C语言代码:

```asm
<_log_xtrace>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %edx,-0x84(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x64(%rbp)
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  jmp    L92
L94:
  lea    -0x30(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  movl   $0x0,-0x68(%rbp)
  jmp    L45
L24:
  mov    -0x68(%rbp),%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L56
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x60(%rbp)
  movb   $0x20,(%rax)
L56:
  mov    -0x68(%rbp),%eax
  and    $0x7,%eax
  test   %eax,%eax
  jne    L37
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x60(%rbp)
  movb   $0x20,(%rax)
L37:
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  sar    $0x4,%al
  movsbl %al,%eax
  and    $0xf,%eax
  mov    %eax,%ecx
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x60(%rbp)
  movslq %ecx,%rdx
  lea    D7(%rip),%rcx
  movzbl (%rdx,%rcx,1),%edx
  mov    %dl,(%rax)
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  and    $0xf,%eax
  mov    %eax,%ecx
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x60(%rbp)
  movslq %ecx,%rdx
  lea    D7(%rip),%rcx
  movzbl (%rdx,%rcx,1),%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x68(%rbp)
L45:
  cmpl   $0xf,-0x68(%rbp)
  jg     L82
  mov    -0x68(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jl     L24
L82:
  mov    -0x60(%rbp),%rax
  movb   $0x0,(%rax)
  lea    -0x50(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  movl   $0x0,-0x68(%rbp)
  jmp    L88
L137:
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jle    L75
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7f,%al
  je     L75
  mov    -0x68(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  jmp    L134
L75:
  mov    $0x20,%edx
L134:
  mov    -0x60(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x60(%rbp)
  mov    %dl,(%rax)
  addl   $0x1,-0x68(%rbp)
L88:
  cmpl   $0xf,-0x68(%rbp)
  jg     L63
  mov    -0x68(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jl     L137
L63:
  mov    -0x60(%rbp),%rax
  movb   $0x0,(%rax)
  subl   $0x10,-0x84(%rbp)
  addq   $0x10,-0x58(%rbp)
  addl   $0x10,-0x64(%rbp)
L92:
  cmpl   $0x0,-0x84(%rbp)
  jg     L94
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L139
  call   <__stack_chk_fail@plt>
L139:
  leave
  ret
```

assistant: ```c
void _log_xtrace(char *text, void *data, int l_data) {
  int a;
  char *x;
  char *dt;
  int adr = 0;
  char buff1[40];
  char buff2[20];
  static char hex[] = "0123456789abcdef";
  dt = (char *)data;
  while (l_data > 0) {
    x = buff1;
    for (a = 0; a < 16 && a < l_data; a++) {
      if ((a & 3) == 0)
        *x++ = ' ';
      if ((a & 7) == 0)
        *x++ = ' ';
      *x++ = hex[(dt[a] >> 4) & 15];
      *x++ = hex[dt[a] & 15];
    }
    *x = 0;
    x = buff2;
    for (a = 0; a < 16 && a < l_data; a++) {
      *x++ = (dt[a] > ' ' && dt[a] < 0x7f) ? dt[a] : ' ';
    }
    *x = 0;
    l_data -= 16;
    dt += 16;
    adr += 16;
  }
}
```