user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<print_bih>:
  endbr64
  push   %r15
  lea    D189(%rip),%rax
  lea    D182(%rip),%r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D101(%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    D19(%rip),%rdi
  call   <printf@plt>
  movzbl 0x11(%rbx),%ecx
  movzbl 0x10(%rbx),%edx
  mov    %r12d,%esi
  lea    D173(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x12(%rbx),%esi
  mov    %rbp,%rdi
  lea    D9(%rip),%r9
  lea    D107(%rip),%r8
  lea    D30(%rip),%rcx
  mov    %esi,%eax
  lea    D137(%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    D62(%rip),%rdi
  test   $0x8,%al
  cmove  %rbp,%rdx
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x13(%rbx),%esi
  pop    %rdx
  lea    D42(%rip),%r11
  lea    D6(%rip),%r10
  lea    D41(%rip),%rdi
  pop    %rcx
  mov    %esi,%eax
  test   %sil,%sil
  lea    D47(%rip),%r9
  cmovns %rbp,%r15
  test   $0x1,%al
  lea    D85(%rip),%r8
  cmove  %rbp,%r11
  lea    D21(%rip),%rcx
  test   $0x2,%al
  cmove  %rbp,%r10
  push   %r15
  lea    D50(%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    D163(%rip),%rdi
  test   $0x40,%al
  cmove  %rbp,%rdx
  xor    %eax,%eax
  call   <printf@plt>
  movzbl 0x1(%rbx),%ecx
  movzbl (%rbx),%eax
  lea    D26(%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: retrieve_data
arguments: tag: D189
datatype: string
name: retrieve_data
arguments: tag: D182
datatype: string
name: retrieve_data
arguments: tag: D101
datatype: string
name: retrieve_data
arguments: tag: D19
datatype: string
name: retrieve_data
arguments: tag: D173
datatype: string
name: retrieve_data
arguments: tag: D9
datatype: string
name: retrieve_data
arguments: tag: D107
datatype: string
name: retrieve_data
arguments: tag: D30
datatype: string
name: retrieve_data
arguments: tag: D137
datatype: string
name: retrieve_data
arguments: tag: D62
datatype: string
name: retrieve_data
arguments: tag: D42
datatype: string
name: retrieve_data
arguments: tag: D6
datatype: string
name: retrieve_data
arguments: tag: D41
datatype: string
name: retrieve_data
arguments: tag: D47
datatype: string
name: retrieve_data
arguments: tag: D85
datatype: string
name: retrieve_data
arguments: tag: D21
datatype: string
name: retrieve_data
arguments: tag: D50
datatype: string
name: retrieve_data
arguments: tag: D163
datatype: string
name: retrieve_data
arguments: tag: D26
datatype: string

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

tool: D182:  other

tool: 

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


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


tool: D9:  SMID

tool: D107:  ILEAVE

tool: D30:  SEQ

tool: D137:  HITOLO

tool: D62: 		Order   = %d %s%s%s%s%s


tool: D42:  DPLAST

tool: D6:  DPPRIV

tool: D41:  DPON

tool: D47:  TPBON

tool: D85:  TPDON

tool: D21:  VLENGTH

tool: D50:  LRLTWO

tool: D163: 		Options = %d %s%s%s%s%s%s%s%s


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