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

```asm
<show_cea_timing>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rcx
  mov    $0x26,%edx
  mov    $0x1,%esi
  lea    D127(%rip),%rax
  mov    %rax,%rdi
  call   <fwrite@plt>
  cmpl   $0x3,-0x10(%rbp)
  jg     L227
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  lea    D25(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  jmp    L286
L227:
  mov    $0x7d,%eax
  sub    -0x10(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x38e38e39,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x10(%rbp),%eax
  lea    -0x4(%rax),%ecx
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  lea    D15(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x28(%rbp),%rax
  lea    D70(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  lea    D109(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L364
  lea    D309(%rip),%rax
  jmp    L135
L364:
  lea    D220(%rip),%rax
L135:
  mov    -0x28(%rbp),%rcx
  mov    %rax,%rdx
  lea    D35(%rip),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L20
  lea    D309(%rip),%rcx
  jmp    L193
L20:
  lea    D124(%rip),%rcx
L193:
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L390
  lea    D309(%rip),%rdx
  jmp    L0
L390:
  lea    D124(%rip),%rdx
L0:
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L340
  lea    D309(%rip),%rax
  jmp    L353
L340:
  lea    D124(%rip),%rax
L353:
  mov    -0x28(%rbp),%rdi
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rax,%rdx
  lea    D29(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%eax
  call   <fprintf@plt>
  movl   $0x4,-0x18(%rbp)
  jmp    L394
L213:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1f,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  shr    $0x5,%al
  movzbl %al,%eax
  cmp    $0x7,%eax
  ja     L253
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D171(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D171(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x18(%rbp),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <show_audio_dbc@plt>
  jmp    L133
L269:
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x7f,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jns    L367
  lea    D17(%rip),%rax
  jmp    L109
L367:
  lea    D309(%rip),%rax
L109:
  mov    -0x4(%rbp),%edx
  mov    -0x28(%rbp),%rdi
  mov    %rax,%rcx
  lea    D277(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%eax
  call   <fprintf@plt>
  addl   $0x1,-0x14(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x14(%rbp)
  jle    L269
  jmp    L133
  mov    -0x18(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <show_vendor_dbc@plt>
  jmp    L133
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x1d(%rbp)
  movzbl -0x1d(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L326
  lea    D301(%rip),%rdi
  jmp    L399
L326:
  lea    D309(%rip),%rdi
L399:
  movzbl -0x1d(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L279
  lea    D300(%rip),%rsi
  jmp    L272
L279:
  lea    D309(%rip),%rsi
L272:
  movzbl -0x1d(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L107
  lea    D151(%rip),%rcx
  jmp    L35
L107:
  lea    D309(%rip),%rcx
L35:
  movzbl -0x1d(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L385
  lea    D134(%rip),%r9
  jmp    L291
L385:
  lea    D309(%rip),%r9
L291:
  movzbl -0x1d(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L396
  lea    D312(%rip),%r8
  jmp    L280
L396:
  lea    D309(%rip),%r8
L280:
  movzbl -0x1d(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L219
  lea    D156(%rip),%rdx
  jmp    L333
L219:
  lea    D309(%rip),%rdx
L333:
  movzbl -0x1d(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L275
  lea    D205(%rip),%rax
  jmp    L78
L275:
  lea    D309(%rip),%rax
L78:
  mov    -0x28(%rbp),%r10
  sub    $0x8,%rsp
  push   %rdi
  push   %rsi
  push   %rcx
  mov    %rdx,%rcx
  mov    %rax,%rdx
  lea    D26(%rip),%rax
  mov    %rax,%rsi
  mov    %r10,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    $0x20,%rsp
  jmp    L133
  mov    -0x18(%rbp),%edx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <show_extended_dbc@plt>
  jmp    L133
L253:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  shr    $0x5,%al
  movzbl %al,%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x28(%rbp),%rax
  lea    D279(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  nop
L133:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  add    %eax,-0x18(%rbp)
L394:
  mov    -0x18(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jl     L213
  movl   $0x0,-0x1c(%rbp)
  jmp    L103
L244:
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L355
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L355
  mov    -0x1c(%rbp),%edx
  mov    -0x28(%rbp),%rax
  lea    D54(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  jmp    L286
L355:
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <show_edid_dtd@plt>
  addl   $0x1,-0x1c(%rbp)
L103:
  mov    -0x1c(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jl     L244
L286:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D127
type_infered: string
name: unpack_data
arguments: tag: D25
type_infered: string
name: unpack_data
arguments: tag: D15
type_infered: string
name: unpack_data
arguments: tag: D70
type_infered: string
name: unpack_data
arguments: tag: D109
type_infered: string
name: unpack_data
arguments: tag: D309
type_infered: string
name: unpack_data
arguments: tag: D220
type_infered: string
name: unpack_data
arguments: tag: D35
type_infered: string
name: unpack_data
arguments: tag: D124
type_infered: string
name: unpack_data
arguments: tag: D29
type_infered: string
name: unpack_data
arguments: tag: D17
type_infered: string
name: unpack_data
arguments: tag: D277
type_infered: string
name: unpack_data
arguments: tag: D301
type_infered: string
name: unpack_data
arguments: tag: D300
type_infered: string
name: unpack_data
arguments: tag: D151
type_infered: string
name: unpack_data
arguments: tag: D134
type_infered: string
name: unpack_data
arguments: tag: D312
type_infered: string
name: unpack_data
arguments: tag: D156
type_infered: string
name: unpack_data
arguments: tag: D205
type_infered: string
name: unpack_data
arguments: tag: D26
type_infered: string
name: unpack_data
arguments: tag: D279
type_infered: string
name: unpack_data
arguments: tag: D54
type_infered: string

tool: D127: Found CEA EDID Timing Extension rev 3


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


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


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


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


tool: 

tool: D220: do not 

tool: D35: IT formats %sdefault to underscan


tool: D124: no 

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


tool: D17: (native)

tool: D277: Video: Code %d %s


tool: D301: Front L/R 

tool: D300: LFE 

tool: D151: Front Center 

tool: D134: Rear L/R 

tool: D312: Rear Center

tool: D156: FrontCenter L/R 

tool: D205: RearCenter L/R 

tool: D26: Speakers: %s%s%s%s%s%s%s


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


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