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

```asm
<print_gcd>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %ecx,-0x48(%rbp)
  mov    -0x44(%rbp),%eax
  imul   -0x48(%rbp),%eax
  test   %eax,%eax
  je     L195
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jne    L244
  movl   $0x0,-0x2c(%rbp)
  jmp    L341
L148:
  addl   $0x1,-0x2c(%rbp)
L341:
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x2c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L113
  mov    -0x2c(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L148
L113:
  mov    -0x2c(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jne    L152
  mov    -0x38(%rbp),%rax
  mov    %rax,%rsi
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L244:
  mov    -0x44(%rbp),%eax
  cmp    -0x48(%rbp),%eax
  jge    L4
  mov    -0x48(%rbp),%eax
  cltd
  idivl  -0x44(%rbp)
  mov    %edx,%eax
  test   %eax,%eax
  jne    L372
  movl   $0x0,-0x28(%rbp)
  jmp    L3
L8:
  movl   $0x0,-0x24(%rbp)
  jmp    L384
L235:
  addl   $0x1,-0x24(%rbp)
L384:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jge    L96
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x44(%rbp),%eax
  imul   -0x28(%rbp),%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  add    %ecx,%eax
  movslq %eax,%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L235
L96:
  mov    -0x24(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jne    L6
  addl   $0x1,-0x28(%rbp)
L3:
  mov    -0x44(%rbp),%eax
  cltd
  idivl  -0x48(%rbp)
  cmp    %eax,-0x28(%rbp)
  jl     L8
  mov    -0x38(%rbp),%rax
  mov    %rax,%rsi
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L372:
  mov    -0x48(%rbp),%eax
  cltd
  idivl  -0x44(%rbp)
  mov    %edx,%eax
  test   %eax,%eax
  je     L4
  movl   $0x1,-0x20(%rbp)
  jmp    L69
L345:
  movl   $0x0,-0x1c(%rbp)
  jmp    L80
L398:
  addl   $0x1,-0x1c(%rbp)
L80:
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ebx
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  imul   -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,%bl
  jne    L234
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x1c(%rbp)
  jl     L398
L234:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x1c(%rbp)
  jne    L13
  addl   $0x1,-0x20(%rbp)
L69:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  mov    %eax,%ebx
  mov    -0x44(%rbp),%eax
  cltd
  idiv   %ebx
  cmp    %eax,-0x20(%rbp)
  jl     L345
  movl   $0x1,-0x20(%rbp)
  jmp    L286
L261:
  movl   $0x0,-0x1c(%rbp)
  jmp    L293
L281:
  addl   $0x1,-0x1c(%rbp)
L293:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x1c(%rbp)
  jge    L347
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ebx
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  imul   -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,%bl
  je     L281
L347:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x1c(%rbp)
  jne    L206
  addl   $0x1,-0x20(%rbp)
L286:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  mov    %eax,%ebx
  mov    -0x48(%rbp),%eax
  cltd
  idiv   %ebx
  cmp    %eax,-0x20(%rbp)
  jl     L261
  movl   $0x0,-0x18(%rbp)
  jmp    L323
L369:
  addl   $0x1,-0x18(%rbp)
L323:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x18(%rbp)
  jge    L349
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  je     L369
L349:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x18(%rbp)
  jne    L374
  movl   $0x0,-0x14(%rbp)
  jmp    L366
L378:
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <putchar@plt>
  addl   $0x1,-0x14(%rbp)
L366:
  mov    -0x44(%rbp),%edx
  mov    -0x48(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <gcd@plt>
  cmp    %eax,-0x14(%rbp)
  jl     L378
L4:
  mov    -0x48(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jge    L249
  mov    -0x44(%rbp),%ecx
  mov    -0x48(%rbp),%edx
  mov    -0x38(%rbp),%rsi
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <print_gcd>
  jmp    L249
L195:
  nop
  jmp    L249
L152:
  nop
  jmp    L249
L6:
  nop
  jmp    L249
L13:
  nop
  jmp    L249
L206:
  nop
  jmp    L249
L374:
  nop
L249:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D6
data_type: string

tool: D6: %s

assistant: ```c
void print_gcd(char s1[], char s2[], int n1, int n2) {
  if (n1 * n2 == 0) {
    return;
  }
  if (n1 == n2) {
    int j;
    for (j = 0; (s1[j] == s2[j]) && (j < n1); j++) {
      ;
    }
    if (j == n1) {
      printf("%s", s1);
    } else
      return;
  }
  if (n1 < n2) {
    if (n2 % n1 == 0) {
      int i, j;
      for (i = 0; i < n1 / n2; i++) {
        for (j = 0; (j < n1) && (s1[j] == s2[n1 * i + j]); j++) {
          ;
        }
        if (j != n1)
          return;
      }
      printf("%s", s1);
    }
    if (n2 % n1 != 0) {
      int i, j, k;
      for (i = 1; i < n1 / gcd(n2, n1); i++) {
        for (j = 0; (s1[j] == s1[gcd(n2, n1) * i + j]) && (j < gcd(n2, n1)); j++) {
          ;
        }
        if (j != gcd(n2, n1))
          return;
      }
      for (i = 1; i < n2 / gcd(n2, n1); i++) {
        for (j = 0; (j < gcd(n2, n1)) && (s2[j] == s2[gcd(n2, n1) * i + j]); j++) {
          ;
        }
        if (j != gcd(n2, n1))
          return;
      }
      for (k = 0; (k < gcd(n2, n1)) && (s1[k] == s2[k]); k++) {
        ;
      }
      if (k != gcd(n2, n1))
        return;
      else {
        for (int i = 0; i < gcd(n2, n1); i++) {
          printf("%c", s1[i]);
        }
      }
    }
  }
  if (n2 < n1) {
    return print_gcd(s2, s1, n2, n1);
  }
}
```