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

```asm
<print_bih>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  movzbl 0x4(%rdi),%eax
  shl    $0x18,%eax
  movzbl 0x5(%rdi),%edx
  shl    $0x10,%edx
  or     %edx,%eax
  movzbl 0x7(%rdi),%edx
  or     %edx,%eax
  movzbl 0x6(%rdi),%r13d
  shl    $0x8,%r13d
  or     %eax,%r13d
  movzbl 0x8(%rdi),%r12d
  shl    $0x18,%r12d
  movzbl 0x9(%rdi),%edx
  shl    $0x10,%edx
  or     %edx,%r12d
  movzbl 0xb(%rdi),%edx
  or     %edx,%r12d
  movzbl 0xa(%rdi),%edx
  shl    $0x8,%edx
  or     %edx,%r12d
  movzbl 0xc(%rdi),%ebp
  shl    $0x18,%ebp
  movzbl 0xd(%rdi),%edx
  shl    $0x10,%edx
  or     %edx,%ebp
  movzbl 0xf(%rdi),%edx
  or     %edx,%ebp
  movzbl 0xe(%rdi),%edx
  shl    $0x8,%edx
  or     %edx,%ebp
  test   %al,%al
  lea    D99(%rip),%rax
  lea    D59(%rip),%rdx
  cmove  %rdx,%rax
  movzbl 0x2(%rdi),%ecx
  movzbl 0x1(%rdi),%edx
  movzbl (%rdi),%esi
  push   %rax
  push   %r12
  mov    %r13d,%r9d
  movzbl 0x3(%rdi),%r8d
  lea    D17(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movzbl 0x11(%rbx),%ecx
  movzbl 0x10(%rbx),%edx
  mov    %ebp,%esi
  lea    D95(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movzbl 0x12(%rbx),%esi
  test   $0xf0,%sil
  lea    D87(%rip),%rax
  lea    D59(%rip),%rdx
  cmove  %rdx,%rax
  test   $0x1,%sil
  lea    D201(%rip),%r9
  cmove  %rdx,%r9
  test   $0x2,%sil
  lea    D126(%rip),%r8
  cmove  %rdx,%r8
  test   $0x4,%sil
  lea    D146(%rip),%rcx
  cmove  %rdx,%rcx
  test   $0x8,%sil
  lea    D192(%rip),%rdx
  lea    D59(%rip),%rdi
  cmove  %rdi,%rdx
  movzbl %sil,%esi
  mov    %rax,(%rsp)
  lea    D109(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movzbl 0x13(%rbx),%eax
  add    $0x10,%rsp
  test   %al,%al
  lea    D87(%rip),%r14
  lea    D59(%rip),%rdx
  cmovns %rdx,%r14
  test   $0x1,%al
  lea    D210(%rip),%r11
  cmove  %rdx,%r11
  test   $0x2,%al
  lea    D155(%rip),%r10
  cmove  %rdx,%r10
  test   $0x4,%al
  lea    D64(%rip),%rdi
  cmove  %rdx,%rdi
  test   $0x8,%al
  lea    D128(%rip),%r9
  cmove  %rdx,%r9
  test   $0x10,%al
  lea    D127(%rip),%r8
  cmove  %rdx,%r8
  test   $0x20,%al
  lea    D5(%rip),%rcx
  cmove  %rdx,%rcx
  test   $0x40,%al
  lea    D165(%rip),%rdx
  lea    D59(%rip),%rsi
  cmove  %rsi,%rdx
  movzbl %al,%esi
  push   %r14
  push   %r11
  push   %r10
  push   %rdi
  lea    D172(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movzbl 0x1(%rbx),%ecx
  add    $0x20,%rsp
  movzbl 0x2(%rbx),%esi
  movzbl (%rbx),%eax
  mov    %ecx,%edi
  sub    %eax,%edi
  mov    $0xffffffffffffffff,%rax
  shl    %cl,%rax
  not    %rax
  test   %eax,%r13d
  setne  %al
  movzbl %al,%eax
  shr    %cl,%r12d
  lea    -0x1(%rbp,%r12,1),%edx
  add    %edx,%eax
  mov    $0x0,%edx
  div    %ebp
  mov    %esi,%ecx
  mov    %edi,%edx
  mov    %eax,%esi
  lea    D22(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: unpack_data
arguments: label: D99
type: string
name: unpack_data
arguments: label: D59
type: string
name: unpack_data
arguments: label: D17
type: string
name: unpack_data
arguments: label: D95
type: string
name: unpack_data
arguments: label: D87
type: string
name: unpack_data
arguments: label: D201
type: string
name: unpack_data
arguments: label: D126
type: string
name: unpack_data
arguments: label: D146
type: string
name: unpack_data
arguments: label: D192
type: string
name: unpack_data
arguments: label: D109
type: string
name: unpack_data
arguments: label: D210
type: string
name: unpack_data
arguments: label: D155
type: string
name: unpack_data
arguments: label: D64
type: string
name: unpack_data
arguments: label: D128
type: string
name: unpack_data
arguments: label: D127
type: string
name: unpack_data
arguments: label: D5
type: string
name: unpack_data
arguments: label: D165
type: string
name: unpack_data
arguments: label: D172
type: string
name: unpack_data
arguments: label: D22
type: string

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

tool: 

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


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


tool: D87:  other

tool: D201:  SMID

tool: D126:  ILEAVE

tool: D146:  SEQ

tool: D192:  HITOLO

tool: D109: 		Order   = %d %s%s%s%s%s


tool: D210:  DPLAST

tool: D155:  DPPRIV

tool: D64:  DPON

tool: D128:  TPBON

tool: D127:  TPDON

tool: D5:  VLENGTH

tool: D165:  LRLTWO

tool: D172: 		Options = %d %s%s%s%s%s%s%s%s


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