user: 请将以下的汇编代码转换成C语言代码：

```asm
<execute>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    $0x1,%esi
  mov    $0x20,%edi
  call   <calloc@plt>
  mov    %rax,-0x8(%rbp)
  jmp    L141
L12:
  movsbl -0x11(%rbp),%eax
  sub    $0x2b,%eax
  cmp    $0x30,%eax
  ja     L114
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D38(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D38(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  jmp    L154
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  sub    $0x1,%edx
  mov    %edx,(%rax)
  jmp    L154
  cmpl   $0x3ff,-0x2c(%rbp)
  jg     L7
  addl   $0x1,-0x2c(%rbp)
  jmp    L7
  cmpl   $0x0,-0x2c(%rbp)
  jle    L26
  subl   $0x1,-0x2c(%rbp)
  jmp    L26
  addl   $0x1,-0xc(%rbp)
  jmp    L157
L16:
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x11(%rbp),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x10(%rbp)
  addl   $0x1,-0xc(%rbp)
L157:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  cmpb   $0x5d,-0x11(%rbp)
  jne    L16
L137:
  mov    -0x8(%rbp),%rdx
  mov    -0x2c(%rbp),%ecx
  mov    -0x28(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <execute>
  mov    %eax,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jne    L137
  jmp    L154
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D34(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L154
  mov    -0x2c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  jmp    L154
L114:
  nop
  jmp    L154
L7:
  nop
  jmp    L154
L26:
  nop
L154:
  addl   $0x1,-0xc(%rbp)
L141:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  cmpb   $0x0,-0x11(%rbp)
  jne    L12
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x2c(%rbp),%eax
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D34
data_type: string
name: parse_data
arguments: label: D5
data_type: string

tool: D34: %c

tool: D5: %d

assistant: ```c
int execute(int *mem, int idx, char *data) {
  char c;
  int idx2 = 0;
  int i = 0;
  char *loopdata = (char *)calloc(32, sizeof(char));
  while ((c = data[i]) != 0) {
    switch (c) {
    case '+':
      mem[idx]++;
      break;
    case '-':
      mem[idx]--;
      break;
    case '>':
      if (idx < 1024) {
        idx++;
      }
      break;
    case '<':
      if (idx > 0) {
        idx--;
      }
      break;
    case '[':
      i++;
      while ((c = data[i]) != ']') {
        loopdata[idx2] = c;
        idx2++;
        i++;
      }
      do {
        idx = execute(mem, idx, loopdata);
      } while (mem[idx] != 0);
      break;
    case '.':
      printf("%c", mem[idx]);
      break;
    case ',':
      scanf("%d", &mem[idx]);
      break;
    default:
      break;
    }
    i++;
  }
  free(loopdata);
  return idx;
}
```