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

```asm
<putsprite_blend_flip_>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8d,-0x40(%rbp)
  mov    %r9d,-0x54(%rbp)
  jmp    L55
L22:
  mov    -0x3c(%rbp),%ebx
  mov    -0x48(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  addq   $0x4,-0x48(%rbp)
  jmp    L144
L10:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%r12d
  cmp    $0xff,%r12d
  je     L33
  sub    %r12d,%ebx
  test   %ebx,%ebx
  jle    L68
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%r12d
  test   %r12d,%r12d
  jne    L95
  jmp    L144
L95:
  mov    %ebx,%eax
  sub    %r12d,%eax
  cmp    %eax,-0x54(%rbp)
  jg     L47
  sub    %r12d,%ebx
  movslq %r12d,%rax
  add    %rax,-0x28(%rbp)
  jmp    L144
L47:
  cmp    -0x54(%rbp),%ebx
  jle    L143
  mov    %ebx,%eax
  sub    -0x54(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  sub    -0x2c(%rbp),%r12d
  mov    -0x2c(%rbp),%eax
  cltq
  add    %rax,-0x28(%rbp)
  mov    -0x54(%rbp),%ebx
L143:
  mov    %ebx,%eax
  sub    %r12d,%eax
  test   %eax,%eax
  jns    L88
  mov    %ebx,%r12d
  jmp    L88
L74:
  sub    $0x1,%ebx
  movslq %ebx,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rcx
  mov    -0x50(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%eax
  movslq %ebx,%rcx
  lea    0x0(,%rcx,4),%rsi
  mov    -0x38(%rbp),%rcx
  lea    (%rsi,%rcx,1),%r13
  mov    0x10(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    %eax,0x0(%r13)
  sub    $0x1,%r12d
L88:
  test   %r12d,%r12d
  jg     L74
L144:
  test   %ebx,%ebx
  jg     L10
  jmp    L17
L33:
  nop
  jmp    L17
L68:
  nop
L17:
  subl   $0x1,-0x40(%rbp)
  mov    -0x54(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,-0x38(%rbp)
L55:
  cmpl   $0x0,-0x40(%rbp)
  jg     L22
  nop
  nop
  add    $0x48,%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %rbp
  ret
```

assistant: ```c
void putsprite_blend_flip_(unsigned *dest, int x, int *linetab, unsigned *palette, int h, int screenwidth, unsigned (*blendfp)(unsigned, unsigned)) {
  for (; h > 0; h--, dest += screenwidth) {
    register int lx = x;
    unsigned char *data = ((unsigned char *)linetab) + (*linetab);
    linetab++;
    while (lx > 0) {
      register int count = *data++;
      if (count == 0xFF)
        break;
      lx -= count;
      if (lx <= 0)
        break;
      count = *data++;
      if (!count)
        continue;
      if ((lx - count) >= screenwidth) {
        lx -= count;
        data += count;
        continue;
      }
      if (lx > screenwidth) {
        int diff = (lx - screenwidth);
        count -= diff;
        data += diff;
        lx = screenwidth;
      }
      if ((lx - count) < 0) {
        count = lx;
      }
      for (; count > 0; count--) {
        --lx;
        dest[lx] = blendfp(palette[*data++], dest[lx]);
      }
    }
  }
}
```