user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<isSubstr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  je     L85
  cmpq   $0x0,-0x28(%rbp)
  jne    L67
L85:
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L111
L67:
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  jmp    L40
L97:
  addl   $0x1,-0x14(%rbp)
L40:
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L97
  jmp    L133
L42:
  addl   $0x1,-0x10(%rbp)
L133:
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L42
  mov    -0x10(%rbp),%edx
  mov    -0x14(%rbp),%eax
  mov    %eax,%esi
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x10(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L51
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L111
L51:
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  jmp    L106
L100:
  movl   $0x0,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x8(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L69
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x4(%rbp)
L121:
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x4(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L72
  addl   $0x1,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L121
  mov    -0xc(%rbp),%eax
  mov    %eax,%esi
  lea    D23(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L111
L72:
  nop
L69:
  addl   $0x1,-0xc(%rbp)
L106:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L100
  lea    D47(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  nop
L111:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D21
type: string
name: parse_data
arguments: data_tag: D9
type: string
name: parse_data
arguments: data_tag: D23
type: string
name: parse_data
arguments: data_tag: D47
type: string

tool: D21: Error!

tool: D9: %d, %d


tool: D23: Yes is Substring from %d


tool: D47: Not a substring

assistant: ```c
void isSubstr(char *str, char *target) {
  if ((target == NULL) || (str == NULL)) {
    printf("Error!\n");
    return;
  }
  int strLen = 0, targetLen = 0;
  while (str[strLen] != '\0')
    strLen++;
  while (target[targetLen] != '\0')
    targetLen++;
  printf("%d, %d\n", strLen, targetLen);
  if (targetLen > strLen) {
    printf("Error!\n");
    return;
  }
  int i = 0, j = 0;
  while (str[i] != '\0') {
    j = 0;
    if (str[i] == target[j]) {
      int newi = i;
      while (1) {
        if (target[j] != str[newi])
          break;
        newi++;
        j++;
        if (target[j] == '\0') {
          printf("Yes is Substring from %d\n", i);
          return;
        }
      }
    }
    i++;
  }
  printf("Not a substring\n");
  return;
}
```