user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<provide_margins>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %edx,%r13d
  push   %r12
  push   %rbp
  mov    %esi,%ebp
  mov    %edx,%esi
  push   %rbx
  sub    $0xc8,%rsp
  mov    %rdi,(%rsp)
  mov    %ebp,%edi
  mov    %ecx,0x8(%rsp)
  call   <allocate_bitmap_with_margins@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L165
  mov    -0x8(%rax),%rax
  lea    0x2(%rbp),%r14d
  xor    %esi,%esi
  movslq %r13d,%r12
  mov    %r14d,%edx
  lea    -0x1(%rax),%rdi
  call   <memset@plt>
  mov    (%rbx,%r12,8),%rax
  xor    %esi,%esi
  mov    %r14d,%edx
  lea    -0x1(%rax),%rdi
  call   <memset@plt>
  test   %r13d,%r13d
  jle    L165
  mov    %ebp,%eax
  mov    %ebp,%r14d
  movslq %ebp,%r13
  movdqa D3(%rip),%xmm2
  and    $0xfffffff0,%r14d
  shr    $0x4,%eax
  xor    %r15d,%r15d
  lea    -0x1(%rax),%ecx
  movslq %r14d,%rax
  mov    %r14d,0xc(%rsp)
  mov    %rax,0x10(%rsp)
  lea    0x1(%r14),%eax
  add    $0x1,%rcx
  mov    %eax,0x20(%rsp)
  cltq
  shl    $0x4,%rcx
  mov    %rax,0x18(%rsp)
  lea    0x2(%r14),%eax
  mov    %eax,0x24(%rsp)
  cltq
  mov    %rax,0x28(%rsp)
  lea    0x3(%r14),%eax
  mov    %eax,0x38(%rsp)
  cltq
  mov    %rax,0x30(%rsp)
  lea    0x4(%r14),%eax
  mov    %eax,0x3c(%rsp)
  cltq
  mov    %rax,0x40(%rsp)
  lea    0x5(%r14),%eax
  mov    %eax,0x50(%rsp)
  cltq
  mov    %rax,0x48(%rsp)
  lea    0x6(%r14),%eax
  mov    %eax,0x54(%rsp)
  cltq
  mov    %rax,0x58(%rsp)
  lea    0x7(%r14),%eax
  mov    %eax,0x68(%rsp)
  cltq
  mov    %rax,0x60(%rsp)
  lea    0x8(%r14),%eax
  mov    %eax,0x6c(%rsp)
  cltq
  mov    %rax,0x70(%rsp)
  lea    0x9(%r14),%eax
  mov    %eax,0x80(%rsp)
  cltq
  mov    %rax,0x78(%rsp)
  lea    0xa(%r14),%eax
  mov    %eax,0x84(%rsp)
  cltq
  mov    %rax,0x88(%rsp)
  lea    0xb(%r14),%eax
  mov    %eax,0x98(%rsp)
  cltq
  mov    %rax,0x90(%rsp)
  lea    0xc(%r14),%eax
  mov    %eax,0x9c(%rsp)
  cltq
  mov    %rax,0xa0(%rsp)
  lea    0xd(%r14),%eax
  mov    %eax,0xb0(%rsp)
  cltq
  mov    %rax,0xa8(%rsp)
  lea    0xe(%r14),%eax
  mov    %r12,%r14
  mov    %ebp,%r12d
  mov    %eax,0xb4(%rsp)
  cltq
  mov    %rbx,%rbp
  mov    %rcx,%rbx
  mov    %rax,0xb8(%rsp)
  jmp    L186
  xchg   %ax,%ax
L98:
  mov    %r12d,%edx
  call   <memcpy@plt>
  movdqa D3(%rip),%xmm2
L70:
  add    $0x1,%r15
  cmp    %r14,%r15
  je     L223
L186:
  mov    (%rsp),%rax
  mov    0x0(%rbp,%r15,8),%rdi
  mov    (%rax,%r15,8),%rsi
  mov    0x8(%rsp),%eax
  movb   $0x0,-0x1(%rdi)
  movb   $0x0,(%rdi,%r13,1)
  test   %eax,%eax
  je     L98
  test   %r12d,%r12d
  jle    L70
  lea    0x1(%rsi),%r11
  mov    %rdi,%r10
  lea    -0x1(%r12),%eax
  sub    %r11,%r10
  cmp    $0xe,%r10
  jbe    L6
  cmp    $0xe,%eax
  jbe    L6
  xor    %eax,%eax
  pxor   %xmm1,%xmm1
  nopl   0x0(%rax,%rax,1)
L128:
  movdqu (%rsi,%rax,1),%xmm0
  pcmpeqb %xmm1,%xmm0
  pandn  %xmm2,%xmm0
  movups %xmm0,(%rdi,%rax,1)
  add    $0x10,%rax
  cmp    %rbx,%rax
  jne    L128
  cmp    0xc(%rsp),%r12d
  je     L70
  mov    0x10(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x20(%rsp),%r12d
  jle    L70
  mov    0x18(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x24(%rsp),%r12d
  jle    L70
  mov    0x28(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x38(%rsp),%r12d
  jle    L70
  mov    0x30(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x3c(%rsp),%r12d
  jle    L70
  mov    0x40(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x50(%rsp),%r12d
  jle    L70
  mov    0x48(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x54(%rsp),%r12d
  jle    L70
  mov    0x58(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x68(%rsp),%r12d
  jle    L70
  mov    0x60(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x6c(%rsp),%r12d
  jle    L70
  mov    0x70(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x80(%rsp),%r12d
  jle    L70
  mov    0x78(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x84(%rsp),%r12d
  jle    L70
  mov    0x88(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x98(%rsp),%r12d
  jle    L70
  mov    0x90(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0x9c(%rsp),%r12d
  jle    L70
  mov    0xa0(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0xb0(%rsp),%r12d
  jle    L70
  mov    0xa8(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  cmp    0xb4(%rsp),%r12d
  jle    L70
  mov    0xb8(%rsp),%rax
  cmpb   $0x0,(%rsi,%rax,1)
  setne  (%rdi,%rax,1)
  add    $0x1,%r15
  cmp    %r14,%r15
  jne    L186
L223:
  mov    %rbp,%rbx
L165:
  add    $0xc8,%rsp
  mov    %rbx,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L6:
  mov    %eax,%r10d
  xor    %eax,%eax
  nopl   (%rax)
L58:
  cmpb   $0x0,(%rsi,%rax,1)
  mov    %rax,%rdx
  setne  (%rdi,%rax,1)
  add    $0x1,%rax
  cmp    %rdx,%r10
  jne    L58
  jmp    L70
```

tool_calls: name: disassemble_data
arguments: tag: D3
data_type: byte[16]

tool: {"D3": [0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01]}

assistant: ```c
unsigned char **provide_margins(unsigned char **pixels, int w, int h, int make_it_0_or_1) {
  unsigned char **result = allocate_bitmap_with_margins(w, h);
  int y;
  if (!result)
    return NULL;
  memset(result[-1] - 1, 0, w + 2);
  memset(result[h] - 1, 0, w + 2);
  for (y = 0; y < h; y++) {
    unsigned char *src_row = pixels[y];
    unsigned char *dst_row = result[y];
    dst_row[-1] = 0;
    dst_row[w] = 0;
    if (!make_it_0_or_1)
      memcpy(dst_row, src_row, w);
    else {
      int x;
      for (x = 0; x < w; x++)
        dst_row[x] = (src_row[x] ? 1 : 0);
    }
  }
  return result;
}
```