user: What is the c source code of the assembly code below:

```asm
<show_cea_timing>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r14
  movzbl 0x2(%rsi),%eax
  mov    %al,0x13(%rsp)
  movzbl %al,%eax
  mov    %eax,%ebx
  mov    %eax,0xc(%rsp)
  mov    %rdi,%rcx
  mov    $0x26,%edx
  mov    $0x1,%esi
  lea    D192(%rip),%rdi
  call   <fwrite@plt>
  cmp    $0x3,%ebx
  jle    L70
  mov    $0x7d,%eax
  mov    0xc(%rsp),%esi
  sub    %esi,%eax
  mov    %eax,%ebx
  mov    %eax,0x18(%rsp)
  cltq
  imul   $0x38e38e39,%rax,%rax
  sar    $0x22,%rax
  sar    $0x1f,%ebx
  sub    %ebx,%eax
  mov    %eax,%r15d
  mov    %eax,0x1c(%rsp)
  lea    -0x4(%rsi),%ecx
  mov    %esi,%ebx
  mov    %esi,%edx
  lea    D185(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r15d,%edx
  lea    D41(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  movzbl 0x3(%r14),%edx
  and    $0xf,%edx
  lea    D5(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  cmpb   $0x0,0x3(%r14)
  lea    D262(%rip),%rdx
  lea    D214(%rip),%rax
  cmovns %rax,%rdx
  lea    D104(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  movzbl 0x3(%r14),%eax
  test   $0x10,%al
  lea    D262(%rip),%r8
  lea    D226(%rip),%rdx
  cmove  %rdx,%r8
  test   $0x20,%al
  lea    D262(%rip),%rcx
  cmove  %rdx,%rcx
  test   $0x40,%al
  lea    D262(%rip),%rdx
  lea    D226(%rip),%rax
  cmove  %rax,%rdx
  lea    D64(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  cmp    $0x4,%ebx
  jle    L5
  mov    $0x4,%ebp
  lea    D262(%rip),%r15
  mov    %r13,%r12
  jmp    L50
L70:
  mov    0xc(%rsp),%edx
  lea    D238(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
L116:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  lea    0x0(%r13,%rbp,1),%eax
  movslq %edx,%rbx
  test   %r13d,%r13d
  jle    L40
  mov    %r13d,0x14(%rsp)
  mov    %eax,%r13d
L82:
  movzbl (%r14,%rbx,1),%eax
  mov    %eax,%edx
  and    $0x7f,%edx
  test   %al,%al
  lea    D272(%rip),%rcx
  cmovns %r15,%rcx
  lea    D157(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    $0x1,%rbx
  cmp    %ebx,%r13d
  jge    L82
  mov    0x14(%rsp),%r13d
  jmp    L40
  mov    %ebp,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <show_audio_dbc@plt>
L40:
  lea    0x1(%r13,%rbp,1),%ebp
  cmp    %ebp,0xc(%rsp)
  jle    L71
L50:
  movslq %ebp,%rax
  movzbl (%r14,%rax,1),%eax
  mov    %eax,%r13d
  and    $0x1f,%r13d
  lea    0x1(%rbp),%edx
  shr    $0x5,%al
  movzbl %al,%ecx
  lea    D12(%rip),%rdi
  movslq (%rdi,%rcx,4),%rcx
  add    %rdi,%rcx
  notrack jmp *%rcx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <show_vendor_dbc@plt>
  jmp    L40
  movslq %edx,%rdx
  movzbl (%r14,%rdx,1),%eax
  test   $0x1,%al
  lea    D86(%rip),%r10
  cmove  %r15,%r10
  test   $0x2,%al
  lea    D100(%rip),%rdi
  cmove  %r15,%rdi
  test   $0x4,%al
  lea    D266(%rip),%rsi
  cmove  %r15,%rsi
  test   $0x8,%al
  lea    D19(%rip),%r9
  cmove  %r15,%r9
  test   $0x10,%al
  lea    D179(%rip),%r8
  cmove  %r15,%r8
  test   $0x20,%al
  lea    D133(%rip),%rcx
  cmove  %r15,%rcx
  test   $0x40,%al
  lea    D269(%rip),%rdx
  cmove  %r15,%rdx
  sub    $0x8,%rsp
  push   %r10
  push   %rdi
  push   %rsi
  lea    D71(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    $0x20,%rsp
  jmp    L40
  mov    %ebp,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <show_extended_dbc@plt>
  jmp    L40
  movzbl %al,%edx
  mov    %r13d,%ecx
  lea    D151(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  jmp    L40
L71:
  mov    %r12,%r13
L5:
  cmpl   $0x11,0x18(%rsp)
  jle    L116
  movzbl 0x13(%rsp),%eax
  lea    (%r14,%rax,1),%rbx
  mov    $0x0,%ebp
  mov    0x1c(%rsp),%r12d
  jmp    L28
L39:
  mov    %r13,%rdi
  call   <show_edid_dtd@plt>
  add    $0x1,%ebp
  add    $0x12,%rbx
  cmp    %ebp,%r12d
  jle    L116
L28:
  mov    %rbx,%rsi
  cmpb   $0x0,(%rbx)
  jne    L39
  cmpb   $0x0,0x1(%rbx)
  jne    L39
  mov    %ebp,%edx
  lea    D84(%rip),%rsi
  mov    %r13,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  jmp    L116
```

tool_calls: name: parse_data
arguments: data_label: D192
type: string
name: parse_data
arguments: data_label: D185
type: string
name: parse_data
arguments: data_label: D41
type: string
name: parse_data
arguments: data_label: D5
type: string
name: parse_data
arguments: data_label: D262
type: string
name: parse_data
arguments: data_label: D214
type: string
name: parse_data
arguments: data_label: D104
type: string
name: parse_data
arguments: data_label: D226
type: string
name: parse_data
arguments: data_label: D64
type: string
name: parse_data
arguments: data_label: D238
type: string
name: parse_data
arguments: data_label: D272
type: string
name: parse_data
arguments: data_label: D157
type: string
name: parse_data
arguments: data_label: D86
type: string
name: parse_data
arguments: data_label: D100
type: string
name: parse_data
arguments: data_label: D266
type: string
name: parse_data
arguments: data_label: D19
type: string
name: parse_data
arguments: data_label: D179
type: string
name: parse_data
arguments: data_label: D133
type: string
name: parse_data
arguments: data_label: D269
type: string
name: parse_data
arguments: data_label: D71
type: string
name: parse_data
arguments: data_label: D151
type: string
name: parse_data
arguments: data_label: D84
type: string

tool: D192: Found CEA EDID Timing Extension rev 3


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


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


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


tool: 

tool: D214: do not 

tool: D104: IT formats %sdefault to underscan


tool: D226: no 

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


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


tool: D272: (native)

tool: D157: Video: Code %d %s


tool: D86: Front L/R 

tool: D100: LFE 

tool: D266: Front Center 

tool: D19: Rear L/R 

tool: D179: Rear Center

tool: D133: FrontCenter L/R 

tool: D269: RearCenter L/R 

tool: D71: Speakers: %s%s%s%s%s%s%s


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


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