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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  lea    -0x100000(%rsp),%r11
L111:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L111
  sub    $0x100,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x1000ec(%rbp)
  movb   $0x61,-0x1000fd(%rbp)
  nop
  jmp    L76
L88:
  lea    D126(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D276(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D278(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D33(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D256(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D209(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D62(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D269(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D152(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D178(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x1000fd(%rbp),%rax
  mov    %rax,%rsi
  lea    D279(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  movzbl -0x1000fd(%rbp),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cmp    $0x8,%eax
  ja     L76
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D165(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D165(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D232(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0xe0(%rbp),%rax
  mov    %rax,%rsi
  lea    D202(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    -0xe0(%rbp),%rax
  lea    D6(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x1000e8(%rbp)
  cmpq   $0x0,-0x1000e8(%rbp)
  je     L114
  lea    -0x1000f4(%rbp),%rdi
  lea    -0x1000f8(%rbp),%rcx
  lea    -0x1000fc(%rbp),%rdx
  lea    -0x1000e0(%rbp),%rsi
  mov    -0x1000e8(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <czytaj@plt>
  mov    %eax,-0x1000ec(%rbp)
L114:
  cmpl   $0x0,-0x1000ec(%rbp)
  je     L40
  lea    D244(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L40:
  mov    -0x1000e8(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  jmp    L76
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x70(%rbp),%rax
  mov    %rax,%rsi
  lea    D202(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    -0x70(%rbp),%rax
  lea    D2(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x1000e8(%rbp)
  cmpq   $0x0,-0x1000e8(%rbp)
  je     L32
  mov    -0x1000f4(%rbp),%edi
  mov    -0x1000f8(%rbp),%ecx
  mov    -0x1000fc(%rbp),%edx
  lea    -0x1000e0(%rbp),%rsi
  mov    -0x1000e8(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <zapisz@plt>
  mov    %eax,-0x1000ec(%rbp)
L32:
  cmpl   $0x0,-0x1000ec(%rbp)
  je     L37
  lea    D80(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L37:
  mov    -0x1000e8(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  jmp    L76
  lea    -0xe0(%rbp),%rax
  mov    %rax,%rdi
  call   <wyswietl@plt>
  jmp    L76
  mov    -0x1000f4(%rbp),%ecx
  mov    -0x1000f8(%rbp),%edx
  mov    -0x1000fc(%rbp),%esi
  lea    -0x1000e0(%rbp),%rax
  mov    %rax,%rdi
  call   <negatyw@plt>
  lea    D170(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L76
  lea    D75(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x1000f0(%rbp),%rax
  mov    %rax,%rsi
  lea    D198(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    -0x1000f0(%rbp),%edi
  mov    -0x1000f4(%rbp),%ecx
  mov    -0x1000f8(%rbp),%edx
  mov    -0x1000fc(%rbp),%esi
  lea    -0x1000e0(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <progowanie@plt>
  mov    -0x1000f0(%rbp),%eax
  mov    %eax,%esi
  lea    D150(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L76
  mov    -0x1000f4(%rbp),%ecx
  mov    -0x1000f8(%rbp),%edx
  mov    -0x1000fc(%rbp),%esi
  lea    -0x1000e0(%rbp),%rax
  mov    %rax,%rdi
  call   <konturowanie@plt>
  lea    D49(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L76
  mov    -0x1000f8(%rbp),%edx
  mov    -0x1000fc(%rbp),%ecx
  lea    -0x1000e0(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <filtr@plt>
  lea    D145(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L76
  mov    -0x1000f4(%rbp),%ecx
  mov    -0x1000f8(%rbp),%edx
  mov    -0x1000fc(%rbp),%esi
  lea    -0x1000e0(%rbp),%rax
  mov    %rax,%rdi
  call   <filtr2@plt>
  lea    D240(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  jmp    L76
  lea    D11(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L76:
  movzbl -0x1000fd(%rbp),%eax
  cmp    $0x30,%al
  jne    L88
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L71
  call   <__stack_chk_fail@plt>
L71:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D126
type_guessed: string
name: retrieve_data
arguments: tag: D276
type_guessed: string
name: retrieve_data
arguments: tag: D278
type_guessed: string
name: retrieve_data
arguments: tag: D33
type_guessed: string
name: retrieve_data
arguments: tag: D256
type_guessed: string
name: retrieve_data
arguments: tag: D209
type_guessed: string
name: retrieve_data
arguments: tag: D62
type_guessed: string
name: retrieve_data
arguments: tag: D269
type_guessed: string
name: retrieve_data
arguments: tag: D152
type_guessed: string
name: retrieve_data
arguments: tag: D178
type_guessed: string
name: retrieve_data
arguments: tag: D279
type_guessed: string
name: retrieve_data
arguments: tag: D165
type_guessed: string
name: retrieve_data
arguments: tag: D232
type_guessed: string
name: retrieve_data
arguments: tag: D202
type_guessed: string
name: retrieve_data
arguments: tag: D6
type_guessed: string
name: retrieve_data
arguments: tag: D244
type_guessed: string
name: retrieve_data
arguments: tag: D149
type_guessed: string
name: retrieve_data
arguments: tag: D2
type_guessed: string
name: retrieve_data
arguments: tag: D80
type_guessed: string
name: retrieve_data
arguments: tag: D170
type_guessed: string
name: retrieve_data
arguments: tag: D75
type_guessed: string
name: retrieve_data
arguments: tag: D198
type_guessed: string
name: retrieve_data
arguments: tag: D150
type_guessed: string
name: retrieve_data
arguments: tag: D49
type_guessed: string
name: retrieve_data
arguments: tag: D145
type_guessed: string
name: retrieve_data
arguments: tag: D240
type_guessed: string
name: retrieve_data
arguments: tag: D11
type_guessed: string

tool: D126: ----------MENU----------

tool: D276: 1 - wczytanie obrazu z pliku

tool: D278: 2 - zapisanie obrazu do pliku

tool: D33: 3 - wyswietlanie obrazu

tool: D256: 4 - negatyw

tool: D209: 5 - progowanie

tool: D62: 6 - konturowanie

tool: D269: 7 - filtr usredniajacy ze wzmocnieniem

tool: D152: 8 - filtrowanie przy uzyciu gradientu Robertsa

tool: D178: 0 - zakonczenie dzialania programu

tool: D279: %c

tool: 

tool: D232: Podaj nazwe pliku:

tool: D202: %s

tool: D6: r

tool: D244: Wczytywanie obrazu powiodlo sie.

tool: D149: Podaj nazwe pliku do zapisu:

tool: D2: w

tool: D80: Zapis obrazu do pliku powiodl sie.

tool: D170: Utworzono negatyw obrazu.

tool: D75: Podaj prog:

tool: D198: %i

tool: D150: Progowanie obrazu przy progu %i zakonczone.


tool: D49: Konturowanie obrazu zakonczone.

tool: D145: Obraz zostal przefiltrowany przy uzyciu filtra usredniajacego ze wzmocnieniem.

tool: D240: Obraz zostal przefiltrowany przy pomocy gradientu Robertsa.

tool: D11: Milego dnia!

assistant: ```c
int main() {
  int wymx, wymy, szarosci, prog;
  int obraz_pgm[512][512];
  int operacja = 0;
  FILE *plik;
  char nazwa[100], nazwa2[100], wybor = 'a';
  while (wybor != '0') {
    printf("----------MENU----------\n");
    printf("1 - wczytanie obrazu z pliku\n");
    printf("2 - zapisanie obrazu do pliku\n");
    printf("3 - wyswietlanie obrazu\n");
    printf("4 - negatyw\n");
    printf("5 - progowanie\n");
    printf("6 - konturowanie\n");
    printf("7 - filtr usredniajacy ze wzmocnieniem\n");
    printf("8 - filtrowanie przy uzyciu gradientu Robertsa\n");
    printf("0 - zakonczenie dzialania programu\n");
    scanf("%c", &wybor);
    switch (wybor) {
    case '1':
      printf("Podaj nazwe pliku:\n");
      scanf("%s", nazwa);
      plik = fopen(nazwa, "r");
      if (plik != NULL)
        operacja = czytaj(plik, obraz_pgm, &wymx, &wymy, &szarosci);
      if (operacja != 0)
        printf("Wczytywanie obrazu powiodlo sie.\n");
      fclose(plik);
      break;
    case '2':
      printf("Podaj nazwe pliku do zapisu:\n");
      scanf("%s", nazwa2);
      plik = fopen(nazwa2, "w");
      if (plik != NULL)
        operacja = zapisz(plik, obraz_pgm, wymx, wymy, szarosci);
      if (operacja != 0)
        printf("Zapis obrazu do pliku powiodl sie.\n");
      fclose(plik);
      break;
    case '3':
      wyswietl(nazwa);
      break;
    case '4':
      negatyw(obraz_pgm, wymx, wymy, szarosci);
      printf("Utworzono negatyw obrazu.\n");
      break;
    case '5':
      printf("Podaj prog:\n");
      scanf("%i", &prog);
      progowanie(obraz_pgm, wymx, wymy, szarosci, prog);
      printf("Progowanie obrazu przy progu %i zakonczone.\n", prog);
      break;
    case '6':
      konturowanie(obraz_pgm, wymx, wymy, szarosci);
      printf("Konturowanie obrazu zakonczone.\n");
      break;
    case '7':
      filtr(obraz_pgm, wymx, wymy);
      printf("Obraz zostal przefiltrowany przy uzyciu filtra usredniajacego ze wzmocnieniem.\n");
      break;
    case '8':
      filtr2(obraz_pgm, wymx, wymy, szarosci);
      printf("Obraz zostal przefiltrowany przy pomocy gradientu Robertsa.\n");
      break;
    case '0':
      printf("Milego dnia!\n");
    }
  }
  return 0;
}
```