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

```asm
<offset_test>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    $0x0,%eax
  call   <prepare_data@plt>
  lea    D68(%rip),%rax
  mov    %rax,%rdi
  call   <ol_lrc_new@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    $0xffffff9c,%esi
  mov    %rax,%rdi
  call   <ol_lrc_set_offset@plt>
  lea    D68(%rip),%rax
  mov    %rax,%rdi
  call   <ol_lrc_new@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,%ebx
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_count@plt>
  cmp    %eax,%ebx
  je     L38
  lea    D62(%rip),%rax
  mov    %rax,%rdx
  mov    $0x3b,%esi
  lea    D74(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L38:
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_count@plt>
  mov    %eax,-0x34(%rbp)
  movl   $0x0,-0x38(%rbp)
  jmp    L20
L1:
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <ol_lrc_get_item@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <ol_lrc_get_item@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_get_time@plt>
  mov    %rax,%rbx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_get_time@plt>
  cmp    %rax,%rbx
  je     L16
  lea    D65(%rip),%rax
  mov    %rax,%rdx
  mov    $0x43,%esi
  lea    D74(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L16:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_get_lyric@plt>
  mov    %eax,%ebx
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_item_get_lyric@plt>
  mov    %ebx,%esi
  mov    %eax,%edi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L9
  lea    D12(%rip),%rax
  mov    %rax,%rdx
  mov    $0x45,%esi
  lea    D74(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L9:
  addl   $0x1,-0x38(%rbp)
L20:
  mov    -0x38(%rbp),%eax
  cmp    -0x34(%rbp),%eax
  jl     L1
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_free@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <ol_lrc_free@plt>
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D68
data_type: string
name: parse_data
arguments: label: D62
data_type: string
name: parse_data
arguments: label: D74
data_type: string
name: parse_data
arguments: label: D65
data_type: string
name: parse_data
arguments: label: D12
data_type: string

tool: D68: /tmp/lrc_basic.lrc

tool: D62: ol_lrc_item_count (lrc1) == ol_lrc_item_count (lrc2)

tool: D74: ERROR[%d]: EXPECT %s failed


tool: D65: ol_lrc_item_get_time (item1) == ol_lrc_item_get_time (item2)

tool: D12: strcmp (ol_lrc_item_get_lyric (item1), ol_lrc_item_get_lyric (item2)) == 0

assistant: ```c
void offset_test() {
  prepare_data();
  struct OlLrc *lrc1 = ol_lrc_new("/tmp/"
                                  "lrc_basic.lrc");
  ol_lrc_set_offset(lrc1, -100);
  struct OlLrc *lrc2 = ol_lrc_new("/tmp/"
                                  "lrc_basic.lrc");
  if (!(ol_lrc_item_count(lrc1) == ol_lrc_item_count(lrc2))) {
    printf("ERROR[%d]: EXPECT %s failed\n", 59, "ol_lrc_item_count (lrc1) == ol_lrc_item_count (lrc2)");
  };
  int i, cnt;
  cnt = ol_lrc_item_count(lrc1);
  for (i = 0; i < cnt; i++) {
    const struct OlLrcItem *item1 = ol_lrc_get_item(lrc1, i);
    const struct OlLrcItem *item2 = ol_lrc_get_item(lrc2, i);
    if (!(ol_lrc_item_get_time(item1) == ol_lrc_item_get_time(item2))) {
      printf("ERROR[%d]: EXPECT %s failed\n", 67, "ol_lrc_item_get_time (item1) == ol_lrc_item_get_time (item2)");
    };
    if (!(strcmp(ol_lrc_item_get_lyric(item1), ol_lrc_item_get_lyric(item2)) == 0)) {
      printf("ERROR[%d]: EXPECT %s failed\n", 69, "strcmp (ol_lrc_item_get_lyric (item1), ol_lrc_item_get_lyric (item2)) == 0");
    };
  }
  ol_lrc_free(lrc1);
  ol_lrc_free(lrc2);
}
```