user: What is the c source code of the assembly code below:

```asm
<print_bih>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x9,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xa,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xb,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xd,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xe,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0xf,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0xc(%rbp),%eax
  movzbl %al,%eax
  test   %eax,%eax
  je     L190
  lea    D258(%rip),%rax
  jmp    L206
L190:
  lea    D23(%rip),%rax
L206:
  mov    -0x18(%rbp),%rdx
  add    $0x3,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edi
  mov    -0x18(%rbp),%rdx
  add    $0x2,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%ecx
  mov    -0x18(%rbp),%rdx
  add    $0x1,%rdx
  movzbl (%rdx),%edx
  movzbl %dl,%edx
  mov    -0x18(%rbp),%rsi
  movzbl (%rsi),%esi
  movzbl %sil,%esi
  mov    -0xc(%rbp),%r8d
  push   %rax
  mov    -0x8(%rbp),%eax
  push   %rax
  mov    %r8d,%r9d
  mov    %edi,%r8d
  lea    D293(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  mov    -0x18(%rbp),%rax
  add    $0x11,%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    D216(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x18(%rbp),%rax
  add    $0x12,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf0,%eax
  test   %eax,%eax
  je     L245
  lea    D291(%rip),%rcx
  jmp    L234
L245:
  lea    D23(%rip),%rcx
L234:
  mov    -0x18(%rbp),%rax
  add    $0x12,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L182
  lea    D44(%rip),%rdi
  jmp    L139
L182:
  lea    D23(%rip),%rdi
L139:
  mov    -0x18(%rbp),%rax
  add    $0x12,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L8
  lea    D277(%rip),%rsi
  jmp    L156
L8:
  lea    D23(%rip),%rsi
L156:
  mov    -0x18(%rbp),%rax
  add    $0x12,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L162
  lea    D328(%rip),%rdx
  jmp    L233
L162:
  lea    D23(%rip),%rdx
L233:
  mov    -0x18(%rbp),%rax
  add    $0x12,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L171
  lea    D129(%rip),%rax
  jmp    L228
L171:
  lea    D23(%rip),%rax
L228:
  mov    -0x18(%rbp),%r8
  add    $0x12,%r8
  movzbl (%r8),%r8d
  movzbl %r8b,%r10d
  sub    $0x8,%rsp
  push   %rcx
  mov    %rdi,%r9
  mov    %rsi,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  mov    %r10d,%esi
  lea    D58(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L142
  lea    D291(%rip),%r8
  jmp    L55
L142:
  lea    D23(%rip),%r8
L55:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L265
  lea    D126(%rip),%rdi
  jmp    L260
L265:
  lea    D23(%rip),%rdi
L260:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L274
  lea    D211(%rip),%rsi
  jmp    L138
L274:
  lea    D23(%rip),%rsi
L138:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L261
  lea    D2(%rip),%rcx
  jmp    L205
L261:
  lea    D23(%rip),%rcx
L205:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L166
  lea    D177(%rip),%r9
  jmp    L63
L166:
  lea    D23(%rip),%r9
L63:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L2
  lea    D86(%rip),%r10
  jmp    L30
L2:
  lea    D23(%rip),%r10
L30:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L249
  lea    D269(%rip),%rdx
  jmp    L70
L249:
  lea    D23(%rip),%rdx
L70:
  mov    -0x18(%rbp),%rax
  add    $0x13,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L168
  lea    D237(%rip),%rax
  jmp    L251
L168:
  lea    D23(%rip),%rax
L251:
  mov    -0x18(%rbp),%r11
  add    $0x13,%r11
  movzbl (%r11),%r11d
  movzbl %r11b,%r11d
  push   %r8
  push   %rdi
  push   %rsi
  push   %rcx
  mov    %r10,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  mov    %r11d,%esi
  lea    D73(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x20,%rsp
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%esi
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %edx,%edi
  sub    %eax,%edi
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    -0x8(%rbp),%edx
  mov    %eax,%ecx
  shr    %cl,%edx
  mov    %edx,%r8d
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    $0xffffffffffffffff,%r9
  mov    %eax,%ecx
  shl    %cl,%r9
  mov    %r9,%rax
  not    %rax
  and    %rdx,%rax
  test   %rax,%rax
  setne  %al
  movzbl %al,%eax
  lea    (%r8,%rax,1),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  sub    $0x1,%eax
  mov    $0x0,%edx
  divl   -0x4(%rbp)
  mov    %esi,%ecx
  mov    %edi,%edx
  mov    %eax,%esi
  lea    D69(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D258
type_guessed: string
name: parse_data
arguments: data_label: D23
type_guessed: string
name: parse_data
arguments: data_label: D293
type_guessed: string
name: parse_data
arguments: data_label: D216
type_guessed: string
name: parse_data
arguments: data_label: D291
type_guessed: string
name: parse_data
arguments: data_label: D44
type_guessed: string
name: parse_data
arguments: data_label: D277
type_guessed: string
name: parse_data
arguments: data_label: D328
type_guessed: string
name: parse_data
arguments: data_label: D129
type_guessed: string
name: parse_data
arguments: data_label: D58
type_guessed: string
name: parse_data
arguments: data_label: D126
type_guessed: string
name: parse_data
arguments: data_label: D211
type_guessed: string
name: parse_data
arguments: data_label: D2
type_guessed: string
name: parse_data
arguments: data_label: D177
type_guessed: string
name: parse_data
arguments: data_label: D86
type_guessed: string
name: parse_data
arguments: data_label: D269
type_guessed: string
name: parse_data
arguments: data_label: D237
type_guessed: string
name: parse_data
arguments: data_label: D73
type_guessed: string
name: parse_data
arguments: data_label: D69
type_guessed: string

tool: D258: *** xd%256 != 0!

tool: 

tool: D293: 		DL = %d, D = %d, P = %d, - = %d, XY = %d x %d, %s


tool: D216: 		L0 = %d, MX = %d, MY = %d


tool: D291:  other

tool: D44:  SMID

tool: D277:  ILEAVE

tool: D328:  SEQ

tool: D129:  HITOLO

tool: D58: 		Order   = %d %s%s%s%s%s


tool: D126:  DPLAST

tool: D211:  DPPRIV

tool: D2:  DPON

tool: D177:  TPBON

tool: D86:  TPDON

tool: D269:  VLENGTH

tool: D237:  LRLTWO

tool: D73: 		Options = %d %s%s%s%s%s%s%s%s


tool: D69: 		%u stripes, %d layers, %d planes


assistant: ```c
void print_bih(unsigned char bih[20]) {
  unsigned int xd, yd, l0;
  xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
  yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
  l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);
  printf("		DL = %d, D = %d, P = %d, - = %d, XY = %d x %d, "
         "%s\n",
         bih[0], bih[1], bih[2], bih[3], xd, yd, (xd % 256) ? "*** xd%256 != 0!" : "");
  printf("		L0 = %d, MX = %d, MY = %d\n", l0, bih[16], bih[17]);
  printf("		Order   = %d %s%s%s%s%s\n", bih[18], bih[18] & 0x08 ? " HITOLO" : "", bih[18] & 0x04 ? " SEQ" : "", bih[18] & 0x02 ? " ILEAVE" : "", bih[18] & 0x01 ? " SMID" : "", bih[18] & 0xf0 ? " other" : "");
  printf("		Options = %d %s%s%s%s%s%s%s%s\n", bih[19], bih[19] & 0x40 ? " LRLTWO" : "", bih[19] & 0x20 ? " VLENGTH" : "", bih[19] & 0x10 ? " TPDON" : "", bih[19] & 0x08 ? " TPBON" : "", bih[19] & 0x04 ? " DPON" : "", bih[19] & 0x02 ? " DPPRIV" : "", bih[19] & 0x01 ? " DPLAST" : "", bih[19] & 0x80 ? " other" : "");
  printf("		%u stripes, %d layers, %d planes\n", ((yd >> bih[1]) + ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0, bih[1] - bih[0], bih[2]);
}
```