user: Translate the below assembly code into C programming language:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    -0x13000(%rsp),%r11
L103:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L103
  sub    $0x8a8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x13898(%rsp)
  xor    %eax,%eax
  lea    D5(%rip),%rsi
  lea    D24(%rip),%rdi
  call   <fopen@plt>
  mov    %rax,%r12
  test   %rax,%rax
  je     L121
L82:
  mov    %r12,%rdi
  call   <feof@plt>
  test   %eax,%eax
  je     L107
L143:
  mov    0x8(%rsp),%eax
  cmp    $0x64,%eax
  jg     L153
  cmpl   $0x64,0xc(%rsp)
  jg     L153
  mov    $0x0,%r15d
  mov    $0x0,%r14d
  lea    D46(%rip),%r13
  test   %eax,%eax
  jg     L181
L156:
  mov    %r12,%rdi
  call   <fclose@plt>
  mov    0x8(%rsp),%eax
  cmp    %r14d,%eax
  jne    L240
  mov    0xc(%rsp),%r8d
  cmp    %ebx,%r8d
  jne    L240
  test   %eax,%eax
  jle    L108
  lea    0x10(%rsp),%rdi
  lea    0x9c50(%rsp),%rsi
  lea    -0x1(%r8),%edx
  lea    (%rdx,%rdx,4),%rdx
  lea    (%rdx,%rdx,4),%rdx
  shl    $0x4,%rdx
  lea    0x9de0(%rsp,%rdx,1),%rcx
  lea    -0x1(%rax),%eax
  lea    0x9c54(%rsp,%rax,4),%r9
  jmp    L130
L121:
  lea    D52(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L82
L107:
  lea    0xc(%rsp),%rcx
  lea    0x8(%rsp),%rdx
  lea    D110(%rip),%rsi
  mov    %r12,%rdi
  call   <fscanf@plt>
  jmp    L143
L153:
  lea    D43(%rip),%rdi
  call   <printf@plt>
  mov    $0xffffffff,%eax
  jmp    L299
L209:
  mov    %eax,%ebx
L148:
  add    $0x1,%r14d
  add    $0x64,%r15
  cmp    %r14d,0x8(%rsp)
  jle    L156
L181:
  mov    %r12,%rdi
  call   <feof@plt>
  test   %eax,%eax
  jne    L156
  cmpl   $0x0,0xc(%rsp)
  jle    L209
  lea    0x10(%rsp,%r15,4),%rbp
  mov    %eax,%ebx
L326:
  mov    %r12,%rdi
  call   <feof@plt>
  test   %eax,%eax
  jne    L148
  mov    %rbp,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <fscanf@plt>
  add    $0x1,%ebx
  add    $0x4,%rbp
  cmp    %ebx,0xc(%rsp)
  jg     L326
  jmp    L148
L240:
  lea    D62(%rip),%rdi
  call   <printf@plt>
  mov    $0xffffffff,%eax
  jmp    L299
L98:
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rax)
  add    $0x4,%rdx
  add    $0x190,%rax
  cmp    %rcx,%rax
  jne    L98
L158:
  add    $0x190,%rdi
  add    $0x4,%rsi
  add    $0x4,%rcx
  cmp    %r9,%rsi
  je     L108
L130:
  mov    %rsi,%rax
  mov    %rdi,%rdx
  test   %r8d,%r8d
  jg     L98
  jmp    L158
L108:
  lea    D16(%rip),%rsi
  lea    D29(%rip),%rdi
  call   <fopen@plt>
  mov    %rax,%r12
  test   %rax,%rax
  je     L133
L271:
  pxor   %xmm0,%xmm0
  cvtsi2ssl 0xc(%rsp),%xmm0
  mov    0x8(%rsp),%edx
  lea    D67(%rip),%rsi
  mov    %r12,%rdi
  mov    $0x1,%eax
  call   <fprintf@plt>
  cmpl   $0x0,0xc(%rsp)
  jle    L312
  lea    0x9c50(%rsp),%rbp
  mov    $0x0,%r14d
  lea    D79(%rip),%r13
  jmp    L188
L133:
  lea    D92(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L271
L320:
  movss  0x0(%rbp,%rbx,4),%xmm0
  mov    %r13,%rsi
  mov    %r12,%rdi
  mov    $0x1,%eax
  call   <fprintf@plt>
  add    $0x1,%rbx
  cmp    %ebx,0x8(%rsp)
  jg     L320
L127:
  add    $0x1,%r14d
  add    $0x190,%rbp
  cmp    %r14d,0xc(%rsp)
  jle    L312
L188:
  mov    $0x0,%ebx
  cmpl   $0x0,0x8(%rsp)
  jg     L320
  jmp    L127
L312:
  mov    %r12,%rdi
  call   <fclose@plt>
  mov    $0x0,%eax
L299:
  mov    0x13898(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L118
  add    $0x138a8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L118:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D5
data_type: string
name: read_data
arguments: data_label: D24
data_type: string
name: read_data
arguments: data_label: D46
data_type: string
name: read_data
arguments: data_label: D52
data_type: string
name: read_data
arguments: data_label: D110
data_type: string
name: read_data
arguments: data_label: D43
data_type: string
name: read_data
arguments: data_label: D62
data_type: string
name: read_data
arguments: data_label: D16
data_type: string
name: read_data
arguments: data_label: D29
data_type: string
name: read_data
arguments: data_label: D67
data_type: string
name: read_data
arguments: data_label: D79
data_type: string
name: read_data
arguments: data_label: D92
data_type: string

tool: D5: r

tool: D24: mat1.txt

tool: D46: %f

tool: D52: The file `mat1.txt` can not be opened!


tool: D110: %d %d

tool: D43: Very large matrix!

tool: D62: Not enough data in the file!

tool: D16: w

tool: D29: mat2.txt

tool: D67: %d %d


tool: D79: %7.2f


tool: D92: The file `mat2.txt` can not be opened!


assistant: ```c
int main() {
  int i, j, m, n;
  float a[100][100], b[100][100];
  FILE *input, *output;
  if ((input = fopen("mat1.txt", "r")) == NULL) {
    printf("The file `mat1.txt` can not be opened!\n");
    exit(1);
  }
  if (!feof(input))
    fscanf(input, "%d %d", &m, &n);
  if ((m > 100) || (n > 100)) {
    printf("Very large matrix!");
    return (-1);
  }
  for (i = 0; i < m && !feof(input); i++)
    for (j = 0; j < n && !feof(input); j++)
      fscanf(input, "%f", &a[i][j]);
  fclose(input);
  if (i != m || j != n) {
    printf("Not enough data in the file!");
    return (-1);
  }
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      b[j][i] = a[i][j];
  if ((output = fopen("mat2.txt", "w")) == NULL) {
    printf("The file `mat2.txt` can not be opened!\n");
    exit(1);
  }
  fprintf(output, "%d %d\n", n, m);
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
      fprintf(output, "%7.2f\n", b[i][j]);
  fclose(output);
  return (0);
}
```