user: Demonstrate the C code that generates the assembly output below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xcb0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    -0xca4(%rbp),%rdx
  lea    -0xca8(%rbp),%rax
  mov    %rax,%rsi
  lea    D65(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D145(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0x0,-0xc98(%rbp)
  jmp    L5
L124:
  movl   $0x0,-0xc94(%rbp)
  jmp    L18
L58:
  lea    -0xc90(%rbp),%rcx
  mov    -0xc94(%rbp),%eax
  movslq %eax,%rsi
  mov    -0xc98(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rsi,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    %rax,%rsi
  lea    D87(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  addl   $0x1,-0xc94(%rbp)
L18:
  mov    -0xca4(%rbp),%eax
  cmp    %eax,-0xc94(%rbp)
  jl     L58
  addl   $0x1,-0xc98(%rbp)
L5:
  mov    -0xca8(%rbp),%eax
  cmp    %eax,-0xc98(%rbp)
  jl     L124
  lea    D132(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    -0xc9c(%rbp),%rdx
  lea    -0xca0(%rbp),%rax
  mov    %rax,%rsi
  lea    D65(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D24(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movl   $0x0,-0xc98(%rbp)
  jmp    L191
L44:
  movl   $0x0,-0xc94(%rbp)
  jmp    L51
L43:
  lea    -0x650(%rbp),%rcx
  mov    -0xc94(%rbp),%eax
  movslq %eax,%rsi
  mov    -0xc98(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  add    %rsi,%rax
  shl    $0x2,%rax
  add    %rcx,%rax
  mov    %rax,%rsi
  lea    D87(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  addl   $0x1,-0xc94(%rbp)
L51:
  mov    -0xc9c(%rbp),%eax
  cmp    %eax,-0xc94(%rbp)
  jl     L43
  addl   $0x1,-0xc98(%rbp)
L191:
  mov    -0xca0(%rbp),%eax
  cmp    %eax,-0xc98(%rbp)
  jl     L44
  lea    D110(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D141(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D64(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    -0xcac(%rbp),%rax
  mov    %rax,%rsi
  lea    D87(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    -0xcac(%rbp),%eax
  cmp    $0x4,%eax
  je     L129
  cmp    $0x4,%eax
  jg     L11
  cmp    $0x3,%eax
  je     L161
  cmp    $0x3,%eax
  jg     L11
  cmp    $0x1,%eax
  je     L27
  cmp    $0x2,%eax
  je     L76
  jmp    L11
L27:
  mov    -0xc9c(%rbp),%r8d
  mov    -0xca0(%rbp),%edi
  mov    -0xca4(%rbp),%ecx
  mov    -0xca8(%rbp),%edx
  lea    -0x650(%rbp),%rsi
  lea    -0xc90(%rbp),%rax
  mov    %r8d,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <add@plt>
  jmp    L53
L76:
  mov    -0xc9c(%rbp),%r8d
  mov    -0xca0(%rbp),%edi
  mov    -0xca4(%rbp),%ecx
  mov    -0xca8(%rbp),%edx
  lea    -0x650(%rbp),%rsi
  lea    -0xc90(%rbp),%rax
  mov    %r8d,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <subtract@plt>
  jmp    L53
L161:
  mov    -0xc9c(%rbp),%r8d
  mov    -0xca0(%rbp),%edi
  mov    -0xca4(%rbp),%ecx
  mov    -0xca8(%rbp),%edx
  lea    -0x650(%rbp),%rsi
  lea    -0xc90(%rbp),%rax
  mov    %r8d,%r9d
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <multiply@plt>
  jmp    L53
L129:
  mov    -0xca4(%rbp),%edx
  mov    -0xca8(%rbp),%ecx
  lea    -0xc90(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <transpose@plt>
  jmp    L53
L11:
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L53:
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L66
  call   <__stack_chk_fail@plt>
L66:
  leave
  ret
```

tool_calls: name: parse_data
arguments: label: D35
datatype: string
name: parse_data
arguments: label: D65
datatype: string
name: parse_data
arguments: label: D145
datatype: string
name: parse_data
arguments: label: D87
datatype: string
name: parse_data
arguments: label: D132
datatype: string
name: parse_data
arguments: label: D24
datatype: string
name: parse_data
arguments: label: D110
datatype: string
name: parse_data
arguments: label: D76
datatype: string
name: parse_data
arguments: label: D38
datatype: string
name: parse_data
arguments: label: D141
datatype: string
name: parse_data
arguments: label: D64
datatype: string
name: parse_data
arguments: label: D90
datatype: string

tool: D35: 
Enter number of rows and columns for matrix 1: 

tool: D65: %d %d

tool: D145: 
Enter matrix 1:


tool: D87: %d

tool: D132: 
Enter number of rows and columns for matrix 2: 

tool: D24: 
Enter matrix 2:


tool: D110: 
1) To perform matrix addition

tool: D76: 
2) To perform matrix subtraction

tool: D38: 
3) To perform matrix multiplication

tool: D141: 
4) To find transpose

tool: D64: 
Enter 1,2,3 or 4: 

tool: D90: 
Invalid Choice

assistant: ```c
int main() {
  int choice, m, n, p, q, i, j;
  int arr1[20][20], arr2[20][20];
  printf("\nEnter number of rows and columns for matrix 1: ");
  scanf("%d %d", &m, &n);
  printf("\nEnter matrix 1:\n");
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      scanf("%d", &arr1[i][j]);
  printf("\nEnter number of rows and columns for matrix 2: ");
  scanf("%d %d", &p, &q);
  printf("\nEnter matrix 2:\n");
  for (i = 0; i < p; i++)
    for (j = 0; j < q; j++)
      scanf("%d", &arr2[i][j]);
  printf("\n1) To perform matrix addition");
  printf("\n2) To perform matrix subtraction");
  printf("\n3) To perform matrix multiplication");
  printf("\n4) To find transpose");
  printf("\nEnter 1,2,3 or 4: ");
  scanf("%d", &choice);
  switch (choice) {
  case 1:
    add(arr1, arr2, m, n, p, q);
    break;
  case 2:
    subtract(arr1, arr2, m, n, p, q);
    break;
  case 3:
    multiply(arr1, arr2, m, n, p, q);
    break;
  case 4:
    transpose(arr1, m, n);
    break;
  default:
    printf("\nInvalid Choice");
  }
  return 0;
}
```