user: 下面的汇编指令对应的C源代码是什么:

```asm
<read_marker>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rdx
  lea    -0xc(%rbp),%rax
  mov    %rdx,%rcx
  mov    $0x2,%edx
  mov    $0x1,%esi
  mov    %rax,%rdi
  call   <fread@plt>
  cmp    $0x2,%eax
  je     L159
  mov    $0xffffffff,%eax
  jmp    L48
L159:
  movzbl -0xc(%rbp),%eax
  cmp    $0xff,%al
  je     L117
  mov    $0xffffffff,%eax
  jmp    L48
L64:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %eax,-0x18(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  jns    L178
  mov    $0xffffffff,%eax
  jmp    L48
L178:
  mov    -0x18(%rbp),%eax
  mov    %al,-0xb(%rbp)
L117:
  movzbl -0xb(%rbp),%eax
  cmp    $0xff,%al
  je     L64
  movzbl -0xb(%rbp),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0xd9,-0x14(%rbp)
  je     L158
  cmpl   $0xda,-0x14(%rbp)
  jne    L39
L158:
  mov    $0x0,%eax
  jmp    L48
L39:
  mov    -0x28(%rbp),%rdx
  lea    -0xc(%rbp),%rax
  mov    %rdx,%rcx
  mov    $0x2,%edx
  mov    $0x1,%esi
  mov    %rax,%rdi
  call   <fread@plt>
  cmp    $0x2,%eax
  je     L8
  mov    $0xffffffff,%eax
  jmp    L48
L8:
  lea    -0xc(%rbp),%rax
  mov    %rax,%rdi
  call   <strbe_to_word@plt>
  sub    $0x2,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jns    L93
  mov    $0xffffffff,%eax
  jmp    L48
L93:
  movl   $0x1,-0x18(%rbp)
  cmpl   $0xbf,-0x14(%rbp)
  jle    L171
  cmpl   $0xc3,-0x14(%rbp)
  jg     L171
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <read_sofx@plt>
  mov    %eax,-0x18(%rbp)
  jmp    L232
L171:
  cmpl   $0xe0,-0x14(%rbp)
  jne    L250
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <read_app0@plt>
  mov    %eax,-0x18(%rbp)
  jmp    L232
L250:
  cmpl   $0xe1,-0x14(%rbp)
  jne    L16
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <read_app1@plt>
  mov    %eax,-0x18(%rbp)
  jmp    L232
L16:
  mov    -0x10(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <fp_move_forward@plt>
  test   %eax,%eax
  jne    L232
  mov    $0xffffffff,%eax
  jmp    L48
L232:
  cmpl   $0x0,-0x18(%rbp)
  jne    L212
  mov    $0xffffffff,%eax
  jmp    L48
L212:
  mov    $0x1,%eax
L48:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L161
  call   <__stack_chk_fail@plt>
L161:
  leave
  ret
```

assistant: ```c
int read_marker(FILE *fp) {
  unsigned char buf[4];
  int clen, ret, id;
  if (fread(buf, 1, 2, fp) != 2)
    return -1;
  if (buf[0] != 0xFF)
    return -1;
  while (buf[1] == 0xFF) {
    if ((ret = getc(fp)) < 0)
      return -1;
    buf[1] = ret;
  }
  id = buf[1];
  if (id == 0xD9 || id == 0xDA) {
    return 0;
  }
  if (fread(buf, 1, 2, fp) != 2)
    return -1;
  clen = strbe_to_word(buf) - 2;
  if (clen < 0)
    return -1;
  ret = 1;
  if (id >= 0xC0 && id <= 0xC3) {
    ret = read_sofx(fp, clen);
  } else if (id == 0xe0) {
    ret = read_app0(fp, clen);
  } else if (id == 0xe1) {
    ret = read_app1(fp, clen);
  } else {
    if (!fp_move_forward(fp, clen))
      return -1;
  }
  if (!ret)
    return -1;
  return 1;
}
```