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

```asm
<testSparse>:
  endbr64
  push   %r13
  xor    %eax,%eax
  xor    %r13d,%r13d
  push   %r12
  lea    D130(%rip),%r12
  push   %rbp
  lea    D136(%rip),%rbp
  push   %rbx
  sub    $0x8,%rsp
  call   <cleanup@plt>
  mov    $0x500000,%esi
  mov    %r12,%rdi
  call   <createZeroFile@plt>
  mov    %r12,%rdi
  call   <blocksCount@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D73(%rip),%rdi
  mov    %rax,%rbx
  call   <syncAndCheckMd4@plt>
  mov    $0x500000,%edx
  mov    %rbp,%rsi
  lea    D18(%rip),%rdi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
  mov    $0x63,%edx
  mov    $0x5,%esi
  mov    %r12,%rdi
  cmp    %rax,%rbx
  setle  %r13b
  call   <changeByte@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D30(%rip),%rdi
  call   <syncAndCheckMd4@plt>
  mov    $0x500000,%edx
  mov    %rbp,%rsi
  lea    D93(%rip),%rdi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
  mov    $0x5,%esi
  mov    %r12,%rdi
  cmp    %rax,%rbx
  setle  %al
  xor    %edx,%edx
  movzbl %al,%eax
  add    %rax,%r13
  call   <changeByte@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D49(%rip),%rdi
  call   <syncAndCheckMd4@plt>
  mov    $0x500000,%edx
  mov    %rbp,%rsi
  lea    D14(%rip),%rdi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
  mov    $0x500000,%esi
  mov    %r12,%rdi
  cmp    %rax,%rbx
  setle  %al
  xor    %edx,%edx
  movzbl %al,%eax
  add    %rax,%r13
  call   <addBytes@plt>
  mov    %r12,%rdi
  call   <blocksCount@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D28(%rip),%rdi
  mov    %rax,%rbx
  call   <syncAndCheckMd4@plt>
  mov    $0xa00000,%edx
  mov    %rbp,%rsi
  lea    D39(%rip),%rdi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
  mov    $0x63,%edx
  mov    $0x700000,%esi
  mov    %r12,%rdi
  cmp    %rax,%rbx
  jg     L19
  call   <changeByte@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D108(%rip),%rdi
  call   <syncAndCheckMd4@plt>
  lea    D145(%rip),%rdi
  mov    $0xa00000,%edx
  mov    %rbp,%rsi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
L11:
  add    $0x8,%rsp
  lea    D88(%rip),%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    10d0 <printf@plt>
  nopl   0x0(%rax,%rax,1)
L19:
  call   <changeByte@plt>
  xor    %r8d,%r8d
  mov    $0x1,%ecx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  lea    D108(%rip),%rdi
  call   <syncAndCheckMd4@plt>
  lea    D145(%rip),%rdi
  mov    $0xa00000,%edx
  mov    %rbp,%rsi
  call   <checkFileSize@plt>
  mov    %rbp,%rdi
  call   <blocksCount@plt>
  cmp    %rax,%rbx
  jle    L11
  test   %r13,%r13
  jne    L11
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

tool_calls: name: unpack_data
arguments: label: D130
type: string
name: unpack_data
arguments: label: D136
type: string
name: unpack_data
arguments: label: D73
type: string
name: unpack_data
arguments: label: D18
type: string
name: unpack_data
arguments: label: D30
type: string
name: unpack_data
arguments: label: D93
type: string
name: unpack_data
arguments: label: D49
type: string
name: unpack_data
arguments: label: D14
type: string
name: unpack_data
arguments: label: D28
type: string
name: unpack_data
arguments: label: D39
type: string
name: unpack_data
arguments: label: D108
type: string
name: unpack_data
arguments: label: D145
type: string
name: unpack_data
arguments: label: D88
type: string

tool: D130: testSource.bin

tool: D136: testDest.bin

tool: D73: recreated source to zero

tool: D18: recreated source to zero size

tool: D30: changed byte (SPARSE) 

tool: D93: changed byte (SPARSE) (size)

tool: D49: changed byte to zero (SPARSE) 

tool: D14: changed byte to zero (SPARSE) (size)

tool: D28: added 5 md (SPARSE) 

tool: D39: added 5 md (SPARSE) (size)

tool: D108: changed one byte (SPARSE) 

tool: D145: changed one byte (SPARSE) (size)

tool: D88: 
  Warning: sparse mode was enabled, but the destination file doesn't seem
  to occupy less disk space then the original file. For certain file systems it's
  okay as they don't support sparse files.

  This warning is safe, sparse files support is NOT required for data integrity.



assistant: ```c
void testSparse() {
  cleanup();
  uint32_t sparseFailCount = 0;
  createZeroFile("testSource.bin", 1024 * 1024 * 5);
  uint32_t sourceBlocksCount = blocksCount("testSource.bin");
  syncAndCheckMd4("recreated source to zero", "testSource.bin", "testDest.bin", 1, 0);
  checkFileSize("recreated source to zero size", "testDest.bin", 1024 * 1024 * 5);
  uint32_t destBlocksCount = blocksCount("testDest.bin");
  if (destBlocksCount >= sourceBlocksCount) {
    sparseFailCount++;
  }
  changeByte("testSource.bin", 5, 'c');
  syncAndCheckMd4("changed byte (SPARSE) ", "testSource.bin", "testDest.bin", 1, 0);
  checkFileSize("changed byte (SPARSE) (size)", "testDest.bin", 1024 * 1024 * 5);
  destBlocksCount = blocksCount("testDest.bin");
  if (destBlocksCount >= sourceBlocksCount) {
    sparseFailCount++;
  }
  changeByte("testSource.bin", 5, 0);
  syncAndCheckMd4("changed byte to zero (SPARSE) ", "testSource.bin", "testDest.bin", 1, 0);
  checkFileSize("changed byte to zero (SPARSE) (size)", "testDest.bin", 1024 * 1024 * 5);
  destBlocksCount = blocksCount("testDest.bin");
  if (destBlocksCount >= sourceBlocksCount) {
    sparseFailCount++;
  }
  addBytes("testSource.bin", 5 * 1024 * 1024, 0);
  sourceBlocksCount = blocksCount("testSource.bin");
  syncAndCheckMd4("added 5 md (SPARSE) ", "testSource.bin", "testDest.bin", 1, 0);
  checkFileSize("added 5 md (SPARSE) (size)", "testDest.bin", 1024 * 1024 * 10);
  destBlocksCount = blocksCount("testDest.bin");
  if (destBlocksCount >= sourceBlocksCount) {
    sparseFailCount++;
  }
  changeByte("testSource.bin", 7 * 1024 * 1024, 'c');
  syncAndCheckMd4("changed one byte (SPARSE) ", "testSource.bin", "testDest.bin", 1, 0);
  checkFileSize("changed one byte (SPARSE) (size)", "testDest.bin", 1024 * 1024 * 10);
  destBlocksCount = blocksCount("testDest.bin");
  if (destBlocksCount >= sourceBlocksCount) {
    sparseFailCount++;
  }
  if (sparseFailCount > 0) {
    printf("\n  Warning: sparse mode was enabled, but the destination file doesn't seem\n"
           "  to occupy less disk space then the original file. For certain file systems it's\n"
           "  okay as they don't support sparse files.\n\n"
           "  This warning is safe, sparse files support is NOT required for data integrity.\n\n");
  }
}
```