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

```asm
<SaveBMP>:
  endbr64
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rbp,%rdi
  mov    %rdx,%rbx
  mov    $0xe,%edx
  sub    $0x50,%rsp
  movdqa D8(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  movabs $0x130364d42,%rax
  lea    0x12(%rsp),%rsi
  movl   $0x4360000,0x1a(%rsp)
  movaps %xmm0,0x20(%rsp)
  pxor   %xmm0,%xmm0
  movaps %xmm0,0x30(%rsp)
  movq   $0x0,0x40(%rsp)
  mov    %rax,0x12(%rsp)
  xor    %eax,%eax
  mov    %ax,0x1e(%rsp)
  call   <gm_memcpy@plt>
  lea    0xe(%rbp),%rdi
  lea    0x20(%rsp),%rsi
  mov    $0x28,%edx
  call   <gm_memcpy@plt>
  lea    0x36(%rbp),%rax
  lea    0x300(%rbx),%rdi
L12:
  movzbl (%rbx),%edx
  movzbl 0x1(%rbx),%ecx
  add    $0x3,%rbx
  add    $0x4,%rax
  movzbl -0x1(%rbx),%esi
  movb   $0x0,-0x1(%rax)
  mov    %cl,-0x3(%rax)
  mov    %sil,-0x4(%rax)
  mov    %dl,-0x2(%rax)
  cmp    %rbx,%rdi
  jne    L12
  lea    0x436(%rbp),%r9
  lea    0x1(%r12),%r10
  lea    0x12c01(%r12),%rdi
  lea    0x13036(%rbp),%r11
L13:
  lea    -0xef(%rdi),%rax
  mov    %r9,%rsi
  cmp    %rax,%r9
  setae  %al
  add    $0x140,%r9
  cmp    %r9,%r10
  jae    L29
  test   %al,%al
  je     L47
L29:
  mov    %r10,%rcx
  nopl   0x0(%rax,%rax,1)
L41:
  movzbl 0x690(%rcx),%edx
  movzbl 0x5a0(%rcx),%eax
  add    $0x10,%rsi
  add    $0xf00,%rcx
  movzbl -0x1e0(%rcx),%ebx
  movzbl -0xf00(%rcx),%r8d
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xa50(%rcx),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xb40(%rcx),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xc30(%rcx),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xd20(%rcx),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xe10(%rcx),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl -0xf0(%rcx),%eax
  shl    $0x8,%rdx
  shl    $0x8,%rax
  or     %r8,%rdx
  or     %rbx,%rax
  movzbl -0x2d0(%rcx),%ebx
  mov    %rdx,(%rsp)
  shl    $0x8,%rax
  or     %rbx,%rax
  movzbl -0x3c0(%rcx),%ebx
  shl    $0x8,%rax
  or     %rbx,%rax
  movzbl -0x4b0(%rcx),%ebx
  shl    $0x8,%rax
  or     %rbx,%rax
  movzbl -0x5a0(%rcx),%ebx
  shl    $0x8,%rax
  or     %rbx,%rax
  movzbl -0x690(%rcx),%ebx
  shl    $0x8,%rax
  or     %rbx,%rax
  movzbl -0x780(%rcx),%ebx
  shl    $0x8,%rax
  or     %rbx,%rax
  mov    %rax,0x8(%rsp)
  movdqa (%rsp),%xmm1
  movups %xmm1,-0x10(%rsi)
  cmp    %rdi,%rcx
  jne    L41
  add    $0x1,%r10
  add    $0x1,%rdi
  cmp    %r11,%r9
  jne    L13
L30:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L84
  add    $0x50,%rsp
  mov    $0x13036,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L47:
  mov    %r10,%rax
  nopl   0x0(%rax,%rax,1)
L6:
  movzbl (%rax),%edx
  add    $0xf0,%rax
  add    $0x1,%rsi
  mov    %dl,-0x1(%rsi)
  cmp    %rdi,%rax
  jne    L6
  add    $0x1,%r10
  add    $0x1,%rdi
  cmp    %r11,%r9
  jne    L13
  jmp    L30
L84:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D8
datatype: byte[16]

tool: {"D8": [0x28,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x08,0x00]}

assistant: ```c
int SaveBMP(unsigned char *src, unsigned char *dst, unsigned char *pal) {
  unsigned char HEADER[] = {'B', 'M', 0x036, 0x30, 0x1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00};
  unsigned char INFOHD[] = {40, 0, 0, 0, 0x40, 1, 0, 0, 0xf0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int total = 0, i, x, y;
  gm_memcpy(&dst[total], HEADER, sizeof(HEADER));
  total += sizeof(HEADER);
  ;
  gm_memcpy(&dst[total], INFOHD, sizeof(INFOHD));
  total += sizeof(INFOHD);
  ;
  for (i = 0; i < 256; i++) {
    unsigned char r, g, b;
    r = *pal++;
    g = *pal++;
    b = *pal++;
    dst[total++] = b;
    dst[total++] = g;
    dst[total++] = r;
    dst[total++] = 0;
  }
  for (y = 240 - 1; y >= 0; y--)
    for (x = 0; x < 320; x++)
      dst[total++] = src[(240 - y) + x * 240];
  return total;
}
```