user: 下面的汇编指令对应的C源代码是什么：

```asm
<print_cmdr>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  lea    D27(%rip),%rdi
  sub    $0x10,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  call   <puts@plt>
  movzbl 0xa7(%rbx),%edi
  movzbl 0xa6(%rbx),%eax
  pxor   %xmm0,%xmm0
  movzbl 0xa8(%rbx),%edx
  movzbl 0x47(%rbx),%esi
  shl    $0x8,%edi
  movzbl 0x82(%rbx),%r8d
  movzbl 0x5(%rbx),%ecx
  add    %eax,%edi
  movzbl 0xa9(%rbx),%eax
  shl    $0x8,%esi
  shl    $0x10,%r8d
  shl    $0x8,%eax
  add    %edx,%eax
  movzbl 0x4(%rbx),%edx
  cvtsi2sd %eax,%xmm0
  movzbl 0x46(%rbx),%eax
  mulsd  D26(%rip),%xmm0
  add    $0x7d0,%edx
  add    %eax,%esi
  movzbl 0x81(%rbx),%eax
  shl    $0x8,%eax
  add    %r8d,%eax
  movzbl 0x80(%rbx),%r8d
  add    %r8d,%eax
  movzbl 0x83(%rbx),%r8d
  shl    $0x18,%r8d
  add    %r8d,%eax
  movzbl 0x8(%rbx),%r8d
  push   %rax
  movzbl 0x7(%rbx),%eax
  shl    $0x10,%r8d
  shl    $0x8,%eax
  add    %r8d,%eax
  movzbl 0x6(%rbx),%r8d
  add    %r8d,%eax
  movzbl 0x9(%rbx),%r8d
  shl    $0x18,%r8d
  add    %r8d,%eax
  movzbl 0x20(%rbx),%r8d
  push   %rax
  movzbl 0x1f(%rbx),%eax
  shl    $0x10,%r8d
  shl    $0x8,%eax
  add    %r8d,%eax
  movzbl 0x1e(%rbx),%r8d
  add    %r8d,%eax
  movzbl 0x21(%rbx),%r8d
  shl    $0x18,%r8d
  add    %r8d,%eax
  mov    $0x88888889,%r8d
  push   %rax
  movzbl 0x99(%rbx),%eax
  push   %rax
  mov    %edi,%eax
  imul   %r8,%rax
  shr    $0x25,%rax
  imul   $0x3c,%eax,%r8d
  sub    %r8d,%edi
  push   %rdi
  lea    D28(%rip),%rdi
  push   %rax
  movzbl 0x1(%rbx),%eax
  push   %rax
  movzbl (%rbx),%eax
  push   %rax
  movzbl 0x3(%rbx),%r9d
  mov    $0x1,%eax
  movzbl 0x2(%rbx),%r8d
  call   <printf@plt>
  movzbl 0x7(%rbx),%edx
  movzbl 0x8(%rbx),%eax
  add    $0x40,%rsp
  movzbl 0x1f(%rbx),%esi
  lea    0x4(%rsp),%rbp
  shl    $0x10,%eax
  shl    $0x8,%edx
  mov    %rbp,%rdi
  add    %eax,%edx
  movzbl 0x6(%rbx),%eax
  shl    $0x8,%esi
  add    %eax,%edx
  movzbl 0x9(%rbx),%eax
  shl    $0x18,%eax
  add    %eax,%edx
  movzbl 0x20(%rbx),%eax
  shl    $0x10,%eax
  add    %eax,%esi
  movzbl 0x1e(%rbx),%eax
  add    %eax,%esi
  movzbl 0x21(%rbx),%eax
  shl    $0x18,%eax
  add    %eax,%esi
  call   <read_block@plt>
  mov    0x4(%rsp),%esi
  mov    %rax,%r12
  mov    %rax,%rdi
  call   <print_pre_dive@plt>
  mov    %r12,%rdi
  call   <free@plt>
  movzbl 0x101(%rbx),%edx
  movzbl 0x7(%rbx),%esi
  mov    %rbp,%rdi
  movzbl 0x102(%rbx),%eax
  shl    $0x8,%edx
  shl    $0x8,%esi
  shl    $0x10,%eax
  add    %eax,%edx
  movzbl 0x100(%rbx),%eax
  add    %eax,%edx
  movzbl 0x103(%rbx),%eax
  shl    $0x18,%eax
  add    %eax,%edx
  movzbl 0x8(%rbx),%eax
  shl    $0x10,%eax
  add    %eax,%esi
  movzbl 0x6(%rbx),%eax
  add    %eax,%esi
  movzbl 0x9(%rbx),%eax
  shl    $0x18,%eax
  add    %eax,%esi
  call   <read_block@plt>
  mov    0x4(%rsp),%esi
  mov    %rax,%rbp
  mov    %rax,%rdi
  call   <print_emc_profile@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L8
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L8:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D27
type_guessed: string
name: read_data
arguments: label: D26
type_guessed: byte[8]
name: read_data
arguments: label: D28
type_guessed: string

tool: D27: Dive Date       Time     BT    Depth Temp Pre Ptr  Pro Ptr  End Ptr

tool: {"D26": [0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x3f]}

tool: D28: %4d %04d-%02d-%02d %02d:%02d:%02d %2d:%02d %5.1f %3dF %08x %08x %08x


assistant: ```c
void print_cmdr(const unsigned char *p) {
  printf("Dive Date       Time     BT    Depth Temp Pre Ptr  Pro Ptr  End Ptr\n");
  printf("%4d %04d-%02d-%02d %02d:%02d:%02d %2d:%02d %5.1f %3dF %08x %08x %08x\n", ((unsigned int)(p + 70)[0] + ((p + 70)[1] << 8)), *(p + 4) + 2000, *(p + 5), *(p + 2), *(p + 3), *p, *(p + 1), ((unsigned int)(p + 128 + 38)[0] + ((p + 128 + 38)[1] << 8)) / 60, ((unsigned int)(p + 128 + 38)[0] + ((p + 128 + 38)[1] << 8)) % 60, ((unsigned int)(p + 128 + 40)[0] + ((p + 128 + 40)[1] << 8)) / 4.0, *(p + 128 + 25), ((unsigned int)(p + 30)[0] + ((p + 30)[1] << 8) + ((p + 30)[2] << 16) + ((p + 30)[3] << 24)), ((unsigned int)(p + 6)[0] + ((p + 6)[1] << 8) + ((p + 6)[2] << 16) + ((p + 6)[3] << 24)), ((unsigned int)(p + 128)[0] + ((p + 128)[1] << 8) + ((p + 128)[2] << 16) + ((p + 128)[3] << 24)));
  unsigned char *profile;
  int size;
  profile = read_block(&size, ((unsigned int)(p + 30)[0] + ((p + 30)[1] << 8) + ((p + 30)[2] << 16) + ((p + 30)[3] << 24)), ((unsigned int)(p + 6)[0] + ((p + 6)[1] << 8) + ((p + 6)[2] << 16) + ((p + 6)[3] << 24)));
  print_pre_dive(profile, size);
  free(profile);
  profile = read_block(&size, ((unsigned int)(p + 6)[0] + ((p + 6)[1] << 8) + ((p + 6)[2] << 16) + ((p + 6)[3] << 24)), ((unsigned int)(p + 256)[0] + ((p + 256)[1] << 8) + ((p + 256)[2] << 16) + ((p + 256)[3] << 24)));
  print_emc_profile(profile, size);
  free(profile);
}
```