user: 请从给定的汇编指令推导出C源代码：

```asm
<print_gcd>:
  endbr64
  push   %r15
  mov    %edx,%r15d
  push   %r14
  mov    %r15d,%eax
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %ecx,%ebx
  imul   %ebx,%eax
  sub    $0x18,%rsp
  mov    %rsi,(%rsp)
  test   %eax,%eax
  je     L73
  nopl   0x0(%rax)
L14:
  cmp    %ebx,%r15d
  je     L300
  jge    L370
  mov    %ebx,%eax
  mov    $0x1,%r12d
  cltd
  idiv   %r15d
  test   %edx,%edx
  je     L147
L94:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  mov    %eax,%r9d
  mov    %r15d,%eax
  cltd
  idiv   %r9d
  cmp    %r12d,%eax
  jle    L237
  xor    %r14d,%r14d
  jmp    L269
  nopl   (%rax)
L115:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  cmp    %r14d,%eax
  jle    L362
  add    $0x1,%r14
L269:
  mov    %r15d,%esi
  mov    %ebx,%edi
  mov    %r14d,0xc(%rsp)
  movzbl 0x0(%rbp,%r14,1),%r13d
  call   <gcd@plt>
  imul   %r12d,%eax
  add    %r14d,%eax
  cltq
  cmp    0x0(%rbp,%rax,1),%r13b
  je     L115
L362:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  cmp    0xc(%rsp),%eax
  jne    L73
  add    $0x1,%r12d
  jmp    L94
  cs nopw 0x0(%rax,%rax,1)
L370:
  mov    (%rsp),%rax
  mov    %rbp,(%rsp)
  jle    L73
  mov    %r15d,%edx
  mov    %ebx,%r15d
  mov    %rax,%rbp
  mov    %edx,%ebx
  mov    %r15d,%eax
  imul   %ebx,%eax
  test   %eax,%eax
  jne    L14
L73:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L300:
  mov    (%rsp),%rax
  movzbl 0x0(%rbp),%ecx
  cmp    %cl,(%rax)
  jne    L250
  test   %r15d,%r15d
  jle    L250
  mov    $0x1,%eax
  cs nopw 0x0(%rax,%rax,1)
L67:
  mov    (%rsp),%rcx
  mov    %eax,%esi
  movzbl (%rcx,%rax,1),%ecx
  cmp    %cl,0x0(%rbp,%rax,1)
  sete   %cl
  cmp    %eax,%r15d
  setg   %dl
  add    $0x1,%rax
  test   %dl,%cl
  jne    L67
L256:
  cmp    %esi,%r15d
  jne    L73
L318:
  add    $0x18,%rsp
  mov    %rbp,%rsi
  lea    D1(%rip),%rdi
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <printf@plt>
  nopl   0x0(%rax,%rax,1)
L147:
  mov    %r15d,%eax
  cltd
  idiv   %ebx
  test   %eax,%eax
  jle    L318
  lea    -0x1(%r15),%edi
  xor    %r9d,%r9d
  xor    %r8d,%r8d
  add    $0x2,%rdi
L18:
  test   %r15d,%r15d
  jle    L325
  movslq %r8d,%rcx
  mov    $0x1,%edx
  add    (%rsp),%rcx
  jmp    L296
  nopl   0x0(%rax,%rax,1)
L106:
  mov    %edx,%esi
  add    $0x1,%rdx
  cmp    %rdx,%rdi
  je     L344
L296:
  movzbl -0x1(%rdx,%rcx,1),%ebx
  cmp    %bl,-0x1(%rbp,%rdx,1)
  je     L106
  jmp    L73
L325:
  xor    %esi,%esi
  nopl   (%rax)
L344:
  cmp    %esi,%r15d
  jne    L73
  add    $0x1,%r9d
  add    %r15d,%r8d
  cmp    %r9d,%eax
  jne    L18
  jmp    L318
L237:
  movl   $0x1,0xc(%rsp)
  nopw   0x0(%rax,%rax,1)
L281:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  mov    %eax,%r9d
  mov    %ebx,%eax
  cltd
  idiv   %r9d
  cmp    0xc(%rsp),%eax
  jle    L335
  xor    %r14d,%r14d
  jmp    L45
  xchg   %ax,%ax
L186:
  mov    (%rsp),%rax
  mov    %r15d,%esi
  mov    %ebx,%edi
  movzbl (%rax,%r14,1),%r13d
  add    $0x1,%r14
  call   <gcd@plt>
  imul   0xc(%rsp),%eax
  mov    (%rsp),%rcx
  add    %r12d,%eax
  cltq
  cmp    (%rcx,%rax,1),%r13b
  jne    L161
L45:
  mov    %r15d,%esi
  mov    %ebx,%edi
  mov    %r14d,%r12d
  call   <gcd@plt>
  cmp    %r14d,%eax
  jg     L186
L161:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  cmp    %r12d,%eax
  jne    L73
  addl   $0x1,0xc(%rsp)
  jmp    L281
L335:
  xor    %r12d,%r12d
  jmp    L357
  nopl   0x0(%rax)
L352:
  mov    (%rsp),%rcx
  movzbl 0x0(%rbp,%r12,1),%eax
  add    $0x1,%r12
  cmp    -0x1(%rcx,%r12,1),%al
  jne    L12
L357:
  mov    %r15d,%esi
  mov    %ebx,%edi
  mov    %r12d,%r13d
  call   <gcd@plt>
  cmp    %r12d,%eax
  jg     L352
L12:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  cmp    %r13d,%eax
  jne    L73
  xor    %r12d,%r12d
  jmp    L366
  nop
L373:
  movsbl 0x0(%rbp,%r12,1),%edi
  add    $0x1,%r12
  call   <putchar@plt>
L366:
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <gcd@plt>
  cmp    %r12d,%eax
  jg     L373
  jmp    L73
L250:
  xor    %esi,%esi
  jmp    L256
```

tool_calls: name: unpack_data
arguments: label: D1
type_guessed: string

tool: D1: %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);
  }
}
```