user: Demonstrate the C code that generates the assembly output below:

```asm
<show_cea_timing>:
  endbr64
  push   %r15
  mov    %rdi,%rcx
  mov    $0x26,%edx
  mov    %rdi,%r15
  push   %r14
  lea    D50(%rip),%rdi
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  movzbl 0x2(%rsi),%eax
  mov    $0x1,%esi
  mov    %eax,%r14d
  mov    %al,0x17(%rsp)
  mov    %eax,0x10(%rsp)
  call   <fwrite@plt>
  mov    0x10(%rsp),%edx
  lea    D181(%rip),%rsi
  cmp    $0x3,%r14d
  jle    L148
  mov    0x10(%rsp),%r14d
  mov    $0x7d,%eax
  lea    D166(%rip),%rsi
  mov    %r15,%rdi
  sub    %r14d,%eax
  mov    %r14d,%edx
  mov    %eax,0x18(%rsp)
  mov    %eax,%ecx
  cltq
  imul   $0x38e38e39,%rax,%rax
  sar    $0x1f,%ecx
  sar    $0x22,%rax
  sub    %ecx,%eax
  lea    -0x4(%r14),%ecx
  mov    %eax,%ebp
  mov    %eax,0x1c(%rsp)
  xor    %eax,%eax
  call   <fprintf@plt>
  mov    %ebp,%edx
  lea    D59(%rip),%rsi
  xor    %eax,%eax
  mov    %r15,%rdi
  lea    D53(%rip),%rbp
  call   <fprintf@plt>
  movzbl 0x3(%rbx),%edx
  mov    %r15,%rdi
  xor    %eax,%eax
  lea    D58(%rip),%rsi
  and    $0xf,%edx
  call   <fprintf@plt>
  cmpb   $0x0,0x3(%rbx)
  lea    D123(%rip),%rdx
  mov    %r15,%rdi
  cmovs  %rbp,%rdx
  lea    D150(%rip),%rsi
  xor    %eax,%eax
  call   <fprintf@plt>
  movzbl 0x3(%rbx),%eax
  lea    D8(%rip),%rdx
  mov    %r15,%rdi
  mov    %rdx,%r8
  mov    %rdx,%rcx
  lea    D117(%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     L37
  mov    $0x4,%r14d
  nopw   0x0(%rax,%rax,1)
L146:
  movslq %r14d,%rax
  lea    0x1(%r14),%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    D48(%rip),%rdi
  movslq (%rdi,%rcx,4),%rcx
  add    %rdi,%rcx
  notrack jmp *%rcx
  mov    %r14d,%edx
  mov    %rbx,%rsi
  mov    %r15,%rdi
  call   <show_extended_dbc@plt>
  xchg   %ax,%ax
L137:
  mov    0x8(%rsp),%eax
  lea    0x1(%rax,%r14,1),%r14d
  cmp    %r14d,0x10(%rsp)
  jg     L146
L37:
  cmpl   $0x11,0x18(%rsp)
  jle    L7
  movzbl 0x17(%rsp),%eax
  mov    0x1c(%rsp),%ebp
  xor    %r12d,%r12d
  add    %rax,%rbx
  cs nopw 0x0(%rax,%rax,1)
L89:
  cmpb   $0x0,(%rbx)
  jne    L32
  cmpb   $0x0,0x1(%rbx)
  je     L121
L32:
  mov    %rbx,%rsi
  mov    %r15,%rdi
  add    $0x1,%r12d
  add    $0x12,%rbx
  call   <show_edid_dtd@plt>
  cmp    %r12d,%ebp
  jg     L89
L7:
  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    D41(%rip),%r11
  lea    D61(%rip),%rdi
  movzbl (%rbx,%rdx,1),%eax
  lea    D175(%rip),%rsi
  lea    D56(%rip),%r9
  lea    D102(%rip),%r8
  lea    D138(%rip),%rcx
  test   $0x1,%al
  lea    D106(%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    %r15,%rdi
  push   %rsi
  lea    D170(%rip),%rsi
  call   <fprintf@plt>
  add    $0x20,%rsp
  jmp    L137
  nopl   0x0(%rax)
  mov    %rbx,%rsi
  mov    %r15,%rdi
  call   <show_vendor_dbc@plt>
  jmp    L137
  nopl   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%eax
  movslq %edx,%r13
  lea    D174(%rip),%r12
  add    %r14d,%eax
  mov    %eax,0xc(%rsp)
  test   %sil,%sil
  je     L137
  xchg   %ax,%ax
L13:
  movzbl (%rbx,%r13,1),%eax
  lea    D7(%rip),%rcx
  mov    %eax,%edx
  and    $0x7f,%edx
  test   %al,%al
  js     L104
  mov    %rbp,%rcx
L104:
  mov    %r12,%rsi
  mov    %r15,%rdi
  xor    %eax,%eax
  add    $0x1,%r13
  call   <fprintf@plt>
  cmp    %r13d,0xc(%rsp)
  jge    L13
  jmp    L137
  nopl   (%rax)
  mov    %r14d,%edx
  mov    %rbx,%rsi
  mov    %r15,%rdi
  call   <show_audio_dbc@plt>
  jmp    L137
  nopl   0x0(%rax,%rax,1)
  mov    0x8(%rsp),%ecx
  movzbl %al,%edx
  lea    D73(%rip),%rsi
  mov    %r15,%rdi
  xor    %eax,%eax
  call   <fprintf@plt>
  jmp    L137
  nopl   (%rax)
L121:
  mov    %r12d,%edx
  lea    D98(%rip),%rsi
L148:
  add    $0x28,%rsp
  mov    %r15,%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: D50
datatype: string
name: disassemble_data
arguments: label: D181
datatype: string
name: disassemble_data
arguments: label: D166
datatype: string
name: disassemble_data
arguments: label: D59
datatype: string
name: disassemble_data
arguments: label: D53
datatype: string
name: disassemble_data
arguments: label: D58
datatype: string
name: disassemble_data
arguments: label: D123
datatype: string
name: disassemble_data
arguments: label: D150
datatype: string
name: disassemble_data
arguments: label: D8
datatype: string
name: disassemble_data
arguments: label: D117
datatype: string
name: disassemble_data
arguments: label: D41
datatype: string
name: disassemble_data
arguments: label: D61
datatype: string
name: disassemble_data
arguments: label: D175
datatype: string
name: disassemble_data
arguments: label: D56
datatype: string
name: disassemble_data
arguments: label: D102
datatype: string
name: disassemble_data
arguments: label: D138
datatype: string
name: disassemble_data
arguments: label: D106
datatype: string
name: disassemble_data
arguments: label: D170
datatype: string
name: disassemble_data
arguments: label: D174
datatype: string
name: disassemble_data
arguments: label: D7
datatype: string
name: disassemble_data
arguments: label: D73
datatype: string
name: disassemble_data
arguments: label: D98
datatype: string

tool: D50: Found CEA EDID Timing Extension rev 3


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


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


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


tool: 

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


tool: D123: do not 

tool: D150: IT formats %sdefault to underscan


tool: D8: no 

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


tool: D41: Front L/R 

tool: D61: LFE 

tool: D175: Front Center 

tool: D56: Rear L/R 

tool: D102: Rear Center

tool: D138: FrontCenter L/R 

tool: D106: RearCenter L/R 

tool: D170: Speakers: %s%s%s%s%s%s%s


tool: D174: Video: Code %d %s


tool: D7: (native)

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


tool: D98: 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));
  }
}
```