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

```asm
<print_bih>:
  endbr64
  push   %r15
  lea    D187(%rip),%rax
  lea    D178(%rip),%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D78(%rip),%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  mov    0x4(%rdi),%r14d
  mov    0x8(%rdi),%r13d
  mov    0xc(%rdi),%r12d
  movzbl 0x2(%rdi),%ecx
  bswap  %r14d
  test   %r14b,%r14b
  movzbl 0x1(%rdi),%edx
  movzbl (%rdi),%esi
  cmove  %rbp,%rax
  bswap  %r13d
  mov    %r14d,%r9d
  bswap  %r12d
  push   %rax
  xor    %eax,%eax
  push   %r13
  movzbl 0x3(%rdi),%r8d
  lea    D91(%rip),%rdi
  call   <printf@plt>
  movzbl 0x11(%rbx),%ecx
  movzbl 0x10(%rbx),%edx
  mov    %r12d,%esi
  lea    D35(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x12(%rbx),%esi
  mov    %rbp,%rdi
  lea    D36(%rip),%r9
  lea    D116(%rip),%r8
  lea    D120(%rip),%rcx
  mov    %esi,%eax
  lea    D71(%rip),%rdx
  test   $0xf0,%al
  cmovne %r15,%rdi
  test   $0x1,%al
  cmove  %rbp,%r9
  test   $0x2,%al
  cmove  %rbp,%r8
  test   $0x4,%al
  mov    %rdi,(%rsp)
  cmove  %rbp,%rcx
  lea    D149(%rip),%rdi
  test   $0x8,%al
  cmove  %rbp,%rdx
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x13(%rbx),%esi
  pop    %rdx
  lea    D52(%rip),%r11
  lea    D173(%rip),%r10
  lea    D134(%rip),%rdi
  pop    %rcx
  mov    %esi,%eax
  test   %sil,%sil
  lea    D132(%rip),%r9
  cmovns %rbp,%r15
  test   $0x1,%al
  lea    D16(%rip),%r8
  cmove  %rbp,%r11
  lea    D28(%rip),%rcx
  test   $0x2,%al
  cmove  %rbp,%r10
  push   %r15
  lea    D76(%rip),%rdx
  test   $0x4,%al
  cmove  %rbp,%rdi
  test   $0x8,%al
  push   %r11
  cmove  %rbp,%r9
  test   $0x10,%al
  push   %r10
  cmove  %rbp,%r8
  test   $0x20,%al
  push   %rdi
  cmove  %rbp,%rcx
  lea    D46(%rip),%rdi
  test   $0x40,%al
  cmove  %rbp,%rdx
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x1(%rbx),%ecx
  movzbl (%rbx),%eax
  lea    D158(%rip),%rdi
  movzbl 0x2(%rbx),%r8d
  mov    %ecx,%r9d
  sub    %eax,%r9d
  mov    $0xffffffffffffffff,%rax
  shl    %cl,%rax
  not    %rax
  test   %eax,%r14d
  setne  %al
  shr    %cl,%r13d
  add    $0x28,%rsp
  mov    %r8d,%ecx
  lea    -0x1(%r12,%r13,1),%edx
  movzbl %al,%eax
  pop    %rbx
  pop    %rbp
  add    %edx,%eax
  xor    %edx,%edx
  div    %r12d
  pop    %r12
  mov    %r9d,%edx
  pop    %r13
  pop    %r14
  pop    %r15
  mov    %eax,%esi
  xor    %eax,%eax
  jmp    1050 <printf@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D187
datatype: string
name: extract_symbolic_data
arguments: data_tag: D178
datatype: string
name: extract_symbolic_data
arguments: data_tag: D78
datatype: string
name: extract_symbolic_data
arguments: data_tag: D91
datatype: string
name: extract_symbolic_data
arguments: data_tag: D35
datatype: string
name: extract_symbolic_data
arguments: data_tag: D36
datatype: string
name: extract_symbolic_data
arguments: data_tag: D116
datatype: string
name: extract_symbolic_data
arguments: data_tag: D120
datatype: string
name: extract_symbolic_data
arguments: data_tag: D71
datatype: string
name: extract_symbolic_data
arguments: data_tag: D149
datatype: string
name: extract_symbolic_data
arguments: data_tag: D52
datatype: string
name: extract_symbolic_data
arguments: data_tag: D173
datatype: string
name: extract_symbolic_data
arguments: data_tag: D134
datatype: string
name: extract_symbolic_data
arguments: data_tag: D132
datatype: string
name: extract_symbolic_data
arguments: data_tag: D16
datatype: string
name: extract_symbolic_data
arguments: data_tag: D28
datatype: string
name: extract_symbolic_data
arguments: data_tag: D76
datatype: string
name: extract_symbolic_data
arguments: data_tag: D46
datatype: string
name: extract_symbolic_data
arguments: data_tag: D158
datatype: string

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

tool: D178:  other

tool: 

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


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


tool: D36:  SMID

tool: D116:  ILEAVE

tool: D120:  SEQ

tool: D71:  HITOLO

tool: D149: 		Order   = %d %s%s%s%s%s


tool: D52:  DPLAST

tool: D173:  DPPRIV

tool: D134:  DPON

tool: D132:  TPBON

tool: D16:  TPDON

tool: D28:  VLENGTH

tool: D76:  LRLTWO

tool: D46: 		Options = %d %s%s%s%s%s%s%s%s


tool: D158: 		%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]);
}
```