user: 请从给定的汇编指令推导出C源代码：

```asm
<show_cea_timing>:
  endbr64
  push   %r15
  mov    %rdi,%rcx
  mov    $0x26,%edx
  push   %r14
  push   %r13
  mov    %rdi,%r13
  lea    D219(%rip),%rdi
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  movzbl 0x2(%rsi),%eax
  mov    $0x1,%esi
  mov    %eax,%r15d
  mov    %al,0x13(%rsp)
  mov    %eax,0xc(%rsp)
  call   <fwrite@plt>
  mov    0xc(%rsp),%edx
  lea    D122(%rip),%rsi
  cmp    $0x3,%r15d
  jle    L50
  mov    0xc(%rsp),%r14d
  mov    $0x7d,%eax
  mov    %r13,%rdi
  lea    D145(%rip),%rbp
  sub    %r14d,%eax
  lea    -0x4(%r14),%ecx
  mov    %r14d,%edx
  mov    %eax,0x18(%rsp)
  mov    %eax,%esi
  cltq
  imul   $0x38e38e39,%rax,%rax
  sar    $0x1f,%esi
  sar    $0x22,%rax
  sub    %esi,%eax
  lea    D191(%rip),%rsi
  mov    %eax,0x1c(%rsp)
  mov    %eax,%r15d
  xor    %eax,%eax
  call   <fprintf@plt>
  mov    %r15d,%edx
  mov    %r13,%rdi
  xor    %eax,%eax
  lea    D116(%rip),%rsi
  call   <fprintf@plt>
  movzbl 0x3(%rbx),%edx
  mov    %r13,%rdi
  xor    %eax,%eax
  lea    D208(%rip),%rsi
  and    $0xf,%edx
  call   <fprintf@plt>
  cmpb   $0x0,0x3(%rbx)
  lea    D104(%rip),%rdx
  mov    %r13,%rdi
  cmovs  %rbp,%rdx
  lea    D198(%rip),%rsi
  xor    %eax,%eax
  call   <fprintf@plt>
  movzbl 0x3(%rbx),%eax
  lea    D222(%rip),%rdx
  mov    %r13,%rdi
  mov    %rdx,%r8
  mov    %rdx,%rcx
  lea    D212(%rip),%rsi
  test   $0x10,%al
  cmovne %rbp,%r8
  test   $0x20,%al
  cmovne %rbp,%rcx
  test   $0x40,%al
  cmovne %rbp,%rdx
  xor    %eax,%eax
  call   <fprintf@plt>
  cmp    $0x4,%r14d
  je     L119
  mov    $0x4,%r12d
  nopl   0x0(%rax)
L54:
  movslq %r12d,%rax
  lea    0x1(%r12),%edx
  movzbl (%rbx,%rax,1),%eax
  mov    %eax,%edi
  mov    %eax,%esi
  shr    $0x5,%al
  and    $0x1f,%edi
  movzbl %al,%ecx
  and    $0x1f,%esi
  mov    %edi,0x8(%rsp)
  lea    D57(%rip),%rdi
  movslq (%rdi,%rcx,4),%rcx
  add    %rdi,%rcx
  notrack jmp *%rcx
  nopl   0x0(%rax)
  mov    %r12d,%edx
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <show_extended_dbc@plt>
  cs nopw 0x0(%rax,%rax,1)
L107:
  mov    0x8(%rsp),%eax
  lea    0x1(%rax,%r12,1),%r12d
  cmp    %r12d,0xc(%rsp)
  jg     L54
L119:
  cmpl   $0x11,0x18(%rsp)
  jle    L93
  movzbl 0x13(%rsp),%eax
  mov    0x1c(%rsp),%ebp
  xor    %r12d,%r12d
  add    %rax,%rbx
  cs nopw 0x0(%rax,%rax,1)
L47:
  cmpb   $0x0,(%rbx)
  jne    L120
  cmpb   $0x0,0x1(%rbx)
  je     L99
L120:
  mov    %rbx,%rsi
  mov    %r13,%rdi
  add    $0x1,%r12d
  add    $0x12,%rbx
  call   <show_edid_dtd@plt>
  cmp    %r12d,%ebp
  jg     L47
L93:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
  movslq %edx,%rdx
  lea    D138(%rip),%r11
  lea    D24(%rip),%rdi
  movzbl (%rbx,%rdx,1),%eax
  lea    D4(%rip),%rsi
  lea    D181(%rip),%r9
  lea    D182(%rip),%r8
  lea    D75(%rip),%rcx
  test   $0x1,%al
  lea    D169(%rip),%rdx
  cmove  %rbp,%r11
  test   $0x2,%al
  cmove  %rbp,%rdi
  test   $0x4,%al
  cmove  %rbp,%rsi
  test   $0x8,%al
  cmove  %rbp,%r9
  test   $0x10,%al
  cmove  %rbp,%r8
  test   $0x20,%al
  cmove  %rbp,%rcx
  test   $0x40,%al
  cmove  %rbp,%rdx
  sub    $0x8,%rsp
  xor    %eax,%eax
  push   %r11
  push   %rdi
  mov    %r13,%rdi
  push   %rsi
  lea    D93(%rip),%rsi
  call   <fprintf@plt>
  add    $0x20,%rsp
  jmp    L107
  nopl   0x0(%rax)
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <show_vendor_dbc@plt>
  jmp    L107
  nopl   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%eax
  movslq %edx,%r15
  lea    D158(%rip),%r14
  add    %r12d,%eax
  test   %sil,%sil
  je     L107
  mov    %r12d,0x14(%rsp)
  mov    %r15,%r12
  mov    %eax,%r15d
  nopl   (%rax)
L10:
  movzbl (%rbx,%r12,1),%eax
  lea    D51(%rip),%rcx
  mov    %r14,%rsi
  mov    %r13,%rdi
  mov    %eax,%edx
  and    $0x7f,%edx
  test   %al,%al
  cmovns %rbp,%rcx
  xor    %eax,%eax
  add    $0x1,%r12
  call   <fprintf@plt>
  cmp    %r12d,%r15d
  jge    L10
  mov    0x14(%rsp),%r12d
  jmp    L107
  nop
  mov    %r12d,%edx
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <show_audio_dbc@plt>
  jmp    L107
  nopl   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%ecx
  movzbl %al,%edx
  lea    D152(%rip),%rsi
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <fprintf@plt>
  jmp    L107
  nopl   (%rax)
L99:
  mov    %r12d,%edx
  lea    D33(%rip),%rsi
L50:
  add    $0x28,%rsp
  mov    %r13,%rdi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10b0 <fprintf@plt>
```

tool_calls: name: disassemble_data
arguments: label: D219
type: string
name: disassemble_data
arguments: label: D122
type: string
name: disassemble_data
arguments: label: D145
type: string
name: disassemble_data
arguments: label: D191
type: string
name: disassemble_data
arguments: label: D116
type: string
name: disassemble_data
arguments: label: D208
type: string
name: disassemble_data
arguments: label: D104
type: string
name: disassemble_data
arguments: label: D198
type: string
name: disassemble_data
arguments: label: D222
type: string
name: disassemble_data
arguments: label: D212
type: string
name: disassemble_data
arguments: label: D138
type: string
name: disassemble_data
arguments: label: D24
type: string
name: disassemble_data
arguments: label: D4
type: string
name: disassemble_data
arguments: label: D181
type: string
name: disassemble_data
arguments: label: D182
type: string
name: disassemble_data
arguments: label: D75
type: string
name: disassemble_data
arguments: label: D169
type: string
name: disassemble_data
arguments: label: D93
type: string
name: disassemble_data
arguments: label: D158
type: string
name: disassemble_data
arguments: label: D51
type: string
name: disassemble_data
arguments: label: D152
type: string
name: disassemble_data
arguments: label: D33
type: string

tool: D219: Found CEA EDID Timing Extension rev 3


tool: D122: Block is empty (off_dtd = %d)


tool: 

tool: D191: Block has DTDs starting at offset %d (%d bytes of DBCs)


tool: D116: There is space for %d DTDs in extension


tool: D208: There are %d native DTDs (between regular and extensions)


tool: D104: do not 

tool: D198: IT formats %sdefault to underscan


tool: D222: no 

tool: D212: Support: %sbasic audio, %sYCrCb 4:4:4, %sYCrCb 4:2:2


tool: D138: Front L/R 

tool: D24: LFE 

tool: D4: Front Center 

tool: D181: Rear L/R 

tool: D182: Rear Center

tool: D75: FrontCenter L/R 

tool: D169: RearCenter L/R 

tool: D93: Speakers: %s%s%s%s%s%s%s


tool: D158: Video: Code %d %s


tool: D51: (native)

tool: D152: Unknown Data Block type tag 0x%x, len 0x%x


tool: D33: End of DTD padding after %d DTDs


assistant: ```c
void show_cea_timing(FILE *outfile, unsigned char *edid_ext) {
  int i, dbc;
  int off_dtd = edid_ext[2];
  int n_dtd;
  fprintf(outfile, "Found CEA EDID Timing Extension rev 3\n");
  if (off_dtd < 4) {
    fprintf(outfile, "Block is empty (off_dtd = %d)\n", off_dtd);
    return;
  }
  n_dtd = (125 - off_dtd) / 18;
  fprintf(outfile, "Block has DTDs starting at offset %d (%d bytes of DBCs)\n", off_dtd, off_dtd - 4);
  fprintf(outfile, "There is space for %d DTDs in extension\n", n_dtd);
  fprintf(outfile, "There are %d native DTDs (between regular and extensions)\n", edid_ext[3] & 0xf);
  fprintf(outfile, "IT formats %sdefault to underscan\n", (edid_ext[3] & 0x80) ? "" : "do not ");
  fprintf(outfile, "Support: %sbasic audio, %sYCrCb 4:4:4, %sYCrCb 4:2:2\n", (edid_ext[3] & 0x40) ? "" : "no ", (edid_ext[3] & 0x20) ? "" : "no ", (edid_ext[3] & 0x10) ? "" : "no ");
  dbc = 4;
  while (dbc < off_dtd) {
    int db_len = edid_ext[dbc + 0] & 0x1f;
    int dbp = dbc + 1;
    switch (edid_ext[dbc + 0] >> 5) {
    case 1:
      show_audio_dbc(outfile, edid_ext, dbc);
      break;
    case 2:
      while (dbp < (dbc + db_len + 1)) {
        int vtype = edid_ext[dbp + 0] & 0x7f;
        fprintf(outfile, "Video: Code %d %s\n", vtype, (edid_ext[dbp + 0] & 0x80) ? "(native)" : "");
        dbp += 1;
      }
      break;
    case 3:
      show_vendor_dbc(outfile, edid_ext, dbc + 1);
      break;
    case 4: {
      unsigned char dbcsp_alloc = edid_ext[dbp + 0];
      fprintf(outfile, "Speakers: %s%s%s%s%s%s%s\n", (dbcsp_alloc & 0x40) ? "RearCenter L/R " : "", (dbcsp_alloc & 0x20) ? "FrontCenter L/R " : "", (dbcsp_alloc & 0x10) ? "Rear Center" : "", (dbcsp_alloc & 0x08) ? "Rear L/R " : "", (dbcsp_alloc & 0x04) ? "Front Center " : "", (dbcsp_alloc & 0x02) ? "LFE " : "", (dbcsp_alloc & 0x01) ? "Front L/R " : "");
      break;
    }
    case 7:
      show_extended_dbc(outfile, edid_ext, dbc);
      break;
    default:
      fprintf(outfile, "Unknown Data Block type tag 0x%x, len 0x%x\n", edid_ext[dbc + 0] >> 5, db_len);
      break;
    }
    dbc += db_len + 1;
  }
  for (i = 0; i < n_dtd; i++) {
    if ((edid_ext[off_dtd + 18 * i + 0] == 0) && (edid_ext[off_dtd + 18 * i + 1] == 0)) {
      fprintf(outfile, "End of DTD padding after %d DTDs\n", i);
      break;
    }
    show_edid_dtd(outfile, edid_ext + (off_dtd + 18 * i));
  }
}
```