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

```asm
<print_plot_str>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %edi,-0x94(%rbp)
  mov    %esi,-0x98(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpl   $0xfff,-0x94(%rbp)
  jle    L62
  mov    -0x94(%rbp),%eax
  sub    $0x800,%eax
  mov    %eax,%esi
  lea    D1(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L71
L62:
  cmpl   $0xfff,-0x98(%rbp)
  jle    L13
  mov    -0x98(%rbp),%eax
  mov    %eax,%esi
  lea    D22(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L71
L13:
  cmpl   $0x7ff,-0x94(%rbp)
  jg     L98
  movl   $0x800,-0x94(%rbp)
L98:
  cmpl   $0x7ff,-0x98(%rbp)
  jg     L123
  movl   $0x800,-0x98(%rbp)
L123:
  lea    -0x80(%rbp),%rax
  mov    $0x6e,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  mov    -0x94(%rbp),%eax
  sub    $0x800,%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x3,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  cltq
  mov    %rax,-0x88(%rbp)
  movq   $0x0,-0x90(%rbp)
  jmp    L117
L112:
  lea    -0x80(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2a,(%rax)
  addq   $0x1,-0x90(%rbp)
L117:
  mov    -0x90(%rbp),%rax
  cmp    -0x88(%rbp),%rax
  jbe    L112
  mov    -0x98(%rbp),%eax
  sub    $0x800,%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x3,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  cltq
  mov    %rax,-0x88(%rbp)
  lea    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2a,%al
  jne    L3
  lea    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2b,(%rax)
  jmp    L88
L3:
  lea    -0x80(%rbp),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movb   $0x7c,(%rax)
  movq   $0x0,-0x90(%rbp)
  jmp    L95
L94:
  lea    -0x80(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L119
  lea    -0x80(%rbp),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
L119:
  addq   $0x1,-0x90(%rbp)
L95:
  mov    -0x90(%rbp),%rax
  cmp    -0x88(%rbp),%rax
  jb     L94
L88:
  mov    -0x94(%rbp),%eax
  lea    -0x800(%rax),%ecx
  lea    -0x80(%rbp),%rax
  mov    %rax,%rdx
  mov    %ecx,%esi
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L71:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L23
  call   <__stack_chk_fail@plt>
L23:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D1
type_infered: string
name: disassemble_data
arguments: data_label: D22
type_infered: string
name: disassemble_data
arguments: data_label: D9
type_infered: string

tool: D1: %5d: value is out of range


tool: D22: %5d: baseline is out of range


tool: D9: %5d: %s


assistant: ```c
void print_plot_str(uint16_t value, uint16_t baseline) {
  char str[110];
  int32_t idx, i;
  if (value > 4095) {
    printf("%5d: value is out of range\n", value - 2048);
    return;
  }
  if (baseline > 4095) {
    printf("%5d: baseline is out of range\n", baseline);
    return;
  }
  if (value < 2048) {
    value = 2048;
  }
  if (baseline < 2048) {
    baseline = 2048;
  }
  bzero(str, sizeof(str));
  idx = (value - 2048) / 20;
  for (i = 0; i <= idx; i++) {
    str[i] = '*';
  }
  idx = (baseline - 2048) / 20;
  if (str[idx] == '*') {
    str[idx] = '+';
  } else {
    str[idx] = '|';
    for (i = 0; i < idx; i++) {
      if (str[i] == '\0') {
        str[i] = ' ';
      }
    }
  }
  printf("%5d: %s\n", value - 2048, str);
}
```