user: 请将以下的汇编代码转换成C语言代码：

```asm
<Parser_SectionSDT>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  movw   $0x0,-0x1a(%rbp)
  movw   $0x0,-0x18(%rbp)
  movw   $0x0,-0x16(%rbp)
  movw   $0x0,-0x14(%rbp)
  movw   $0x0,-0x12(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0xffffffff,-0x4(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L131
  lea    D163(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    $0xffffffff,%eax
  jmp    L120
L131:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x42,%al
  je     L92
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x46,%al
  je     L92
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D64(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    $0xffffffff,%eax
  jmp    L120
L92:
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  and    $0xf00,%ax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %ax,-0x16(%rbp)
  lea    D59(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D32(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    $0x7,%al
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D10(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movzwl -0x16(%rbp),%eax
  mov    %eax,%edx
  lea    D174(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,%edx
  lea    D90(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    %eax
  and    $0x1f,%eax
  mov    %eax,%edx
  lea    D221(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  lea    D152(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D112(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D132(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    $0x9,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,%edx
  lea    D115(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movzwl -0x16(%rbp),%eax
  lea    -0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x18,%eax
  mov    %eax,%ecx
  movzwl -0x16(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  or     %eax,%ecx
  mov    %ecx,%edx
  movzwl -0x16(%rbp),%eax
  lea    0x1(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%edx
  movzwl -0x16(%rbp),%eax
  lea    0x2(%rax),%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,%edx
  lea    D198(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  addl   $0xb,-0x8(%rbp)
  movzwl -0x16(%rbp),%eax
  sub    $0xc,%eax
  mov    %ax,-0x12(%rbp)
  movl   $0x0,-0x10(%rbp)
  jmp    L64
L124:
  lea    D93(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%eax
  add    $0x3,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  and    $0xf00,%ax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    $0x4,%eax
  mov    %eax,%ecx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %ax,-0x14(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,%ecx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %edx,%eax
  mov    %eax,%edx
  lea    D151(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%eax
  add    $0x2,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    %eax
  and    $0x1,%eax
  mov    %eax,%edx
  lea    D173(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%eax
  add    $0x2,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  lea    D17(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%eax
  add    $0x3,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  shr    $0x5,%al
  movzbl %al,%eax
  mov    %eax,%edx
  lea    D182(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%eax
  add    $0x3,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sar    $0x4,%eax
  and    $0x1,%eax
  mov    %eax,%edx
  lea    D52(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movzwl -0x14(%rbp),%eax
  mov    %eax,%edx
  lea    D88(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  addl   $0x5,-0x8(%rbp)
  movl   $0x0,-0xc(%rbp)
  jmp    L27
L106:
  lea    D5(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x8(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0x48,%eax
  je     L50
  cmp    $0x5d,%eax
  je     L6
  jmp    L108
L50:
  mov    -0x8(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  call   <x48_Tag_DescriptorParser@plt>
  mov    %ax,-0x1a(%rbp)
  jmp    L67
L6:
  mov    -0x8(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  call   <x5D_Tag_DescriptorParser@plt>
  mov    %ax,-0x1a(%rbp)
  jmp    L67
L108:
  mov    -0x8(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  call   <x00_Tag_DescriptorParser@plt>
  mov    %ax,-0x1a(%rbp)
  nop
L67:
  addw   $0x2,-0x1a(%rbp)
  movzwl -0x1a(%rbp),%eax
  add    %eax,-0x8(%rbp)
  lea    D103(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movzwl -0x1a(%rbp),%eax
  add    %eax,-0xc(%rbp)
L27:
  movzwl -0x14(%rbp),%eax
  cmp    %eax,-0xc(%rbp)
  jb     L106
  movzwl -0x14(%rbp),%eax
  add    $0x5,%eax
  mov    %ax,-0x18(%rbp)
  lea    D103(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movzwl -0x18(%rbp),%eax
  add    %eax,-0x10(%rbp)
L64:
  movzwl -0x12(%rbp),%eax
  cmp    %eax,-0x10(%rbp)
  jb     L124
  lea    D103(%rip),%rax
  mov    %rax,%rsi
  mov    $0x40,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movl   $0x0,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
L120:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D163
type: string
name: extract_symbolic_data
arguments: data_label: D64
type: string
name: extract_symbolic_data
arguments: data_label: D59
type: string
name: extract_symbolic_data
arguments: data_label: D32
type: string
name: extract_symbolic_data
arguments: data_label: D10
type: string
name: extract_symbolic_data
arguments: data_label: D174
type: string
name: extract_symbolic_data
arguments: data_label: D90
type: string
name: extract_symbolic_data
arguments: data_label: D221
type: string
name: extract_symbolic_data
arguments: data_label: D152
type: string
name: extract_symbolic_data
arguments: data_label: D112
type: string
name: extract_symbolic_data
arguments: data_label: D132
type: string
name: extract_symbolic_data
arguments: data_label: D115
type: string
name: extract_symbolic_data
arguments: data_label: D198
type: string
name: extract_symbolic_data
arguments: data_label: D93
type: string
name: extract_symbolic_data
arguments: data_label: D151
type: string
name: extract_symbolic_data
arguments: data_label: D173
type: string
name: extract_symbolic_data
arguments: data_label: D17
type: string
name: extract_symbolic_data
arguments: data_label: D182
type: string
name: extract_symbolic_data
arguments: data_label: D52
type: string
name: extract_symbolic_data
arguments: data_label: D88
type: string
name: extract_symbolic_data
arguments: data_label: D5
type: string
name: extract_symbolic_data
arguments: data_label: D103
type: string

tool: D163: SDT error: section is NULL !


tool: D64: SDT table id is error : %x


tool: D59: ****************SDT Info****************


tool: D32: SDT table id = 0x%x


tool: D10: SDT section_syntax_indicator = 0x%x


tool: D174: SDT section_length = 0x%x


tool: D90: SDT transport_stream_id = 0x%x


tool: D221: SDT version_number = 0x%x


tool: D152: SDT current_next_indicator = 0x%x


tool: D112: SDT section_number = 0x%x


tool: D132: SDT last_section_number = 0x%x


tool: D115: SDT original_network_id = 0x%x


tool: D198: SDT crc = 0x%08x


tool: D93: ****************SDT Service Info****************


tool: D151: SDT service_id = 0x%x


tool: D173: SDT EIT_schedule_flag = 0x%x


tool: D17: SDT EIT_present_following_flag = 0x%x


tool: D182: SDT running_status = 0x%x


tool: D52: SDT free_CA_mode = 0x%x


tool: D88: SDT descriptors_loop_length = 0x%x


tool: D5: ****************SDT Service Descriptor Info****************


tool: D103: ****************************************


assistant: ```c
int Parser_SectionSDT(unsigned char *section) {
  unsigned short descriptor_offset = 0;
  unsigned short service_offset = 0;
  unsigned short section_len = 0;
  unsigned short descriptor_loop_len = 0;
  unsigned short service_loop_len = 0;
  unsigned int i = 0, j = 0;
  unsigned int data_offset = 0;
  int ret = -1;
  if (NULL == section) {
    Parser_TsPacketLog((0x00000040), "SDT error: section is NULL !\n");
    return -1;
  }
  if ((0x42 != section[0]) && (0x46 != section[0])) {
    Parser_TsPacketLog((0x00000040), "SDT table id is error : %x\n", section[0]);
    return -1;
  }
  section_len = ((section[1] & 0x0F) << 8) | (section[2] & 0xFF);
  Parser_TsPacketLog((0x00000040), "****************SDT Info****************\n");
  Parser_TsPacketLog((0x00000040), "SDT table id = 0x%x\n", section[0]);
  Parser_TsPacketLog((0x00000040), "SDT section_syntax_indicator = 0x%x\n", (section[1] & 0x80) >> 7);
  Parser_TsPacketLog((0x00000040), "SDT section_length = 0x%x\n", section_len);
  Parser_TsPacketLog((0x00000040), "SDT transport_stream_id = 0x%x\n", ((section[3] & 0xFF) << 8) | (section[4] & 0xFF));
  Parser_TsPacketLog((0x00000040), "SDT version_number = 0x%x\n", (section[5] & 0x3E) >> 1);
  Parser_TsPacketLog((0x00000040), "SDT current_next_indicator = 0x%x\n", section[5] & 0x01);
  Parser_TsPacketLog((0x00000040), "SDT section_number = 0x%x\n", section[6]);
  Parser_TsPacketLog((0x00000040), "SDT last_section_number = 0x%x\n", section[7]);
  Parser_TsPacketLog((0x00000040), "SDT original_network_id = 0x%x\n", ((section[8] & 0xFF) << 8) | (section[9] & 0xFF));
  Parser_TsPacketLog((0x00000040), "SDT crc = 0x%08x\n", (section[section_len - 1] << 24) | ((section[section_len] & 0xFF) << 16) | ((section[section_len + 1] & 0xFF) << 8) | (section[section_len + 2] & 0xFF));
  data_offset += 11;
  service_loop_len = section_len - 12;
  for (i = 0; i < service_loop_len; i += service_offset) {
    Parser_TsPacketLog((0x00000040), "****************SDT Service Info****************\n");
    descriptor_loop_len = ((section[data_offset + 3] & 0x0F) << 8) | (section[data_offset + 4] & 0xFF);
    Parser_TsPacketLog((0x00000040), "SDT service_id = 0x%x\n", ((section[data_offset] & 0xFF) << 8) | (section[data_offset + 1] & 0xFF));
    Parser_TsPacketLog((0x00000040), "SDT EIT_schedule_flag = 0x%x\n", (section[data_offset + 2] & 0x02) >> 1);
    Parser_TsPacketLog((0x00000040), "SDT EIT_present_following_flag = 0x%x\n", (section[data_offset + 2] & 0x01));
    Parser_TsPacketLog((0x00000040), "SDT running_status = 0x%x\n", (section[data_offset + 3] & 0xE0) >> 5);
    Parser_TsPacketLog((0x00000040), "SDT free_CA_mode = 0x%x\n", (section[data_offset + 3] & 0x10) >> 4);
    Parser_TsPacketLog((0x00000040), "SDT descriptors_loop_length = 0x%x\n", descriptor_loop_len);
    data_offset += 5;
    for (j = 0; j < descriptor_loop_len; j += descriptor_offset) {
      Parser_TsPacketLog((0x00000040), "****************SDT Service Descriptor Info****************\n");
      switch (section[data_offset]) {
      case 0x48:
        descriptor_offset = x48_Tag_DescriptorParser((0x00000040), section + data_offset);
        break;
      case 0x5D:
        descriptor_offset = x5D_Tag_DescriptorParser((0x00000040), section + data_offset);
        break;
      default:
        descriptor_offset = x00_Tag_DescriptorParser((0x00000040), section + data_offset);
        break;
      }
      descriptor_offset += 2;
      data_offset += descriptor_offset;
      Parser_TsPacketLog((0x00000040), "****************************************\n");
    }
    service_offset = descriptor_loop_len + 5;
    Parser_TsPacketLog((0x00000040), "****************************************\n");
  }
  Parser_TsPacketLog((0x00000040), "****************************************\n");
  ret = 0;
  return ret;
}
```