fork download
  1. section .data
  2. usage db "Usage: ./caesar {input_file} {output_file} {shift}", 10, 0
  3. len_usage equ $ - usage ; Подсчитываем длину строки usage
  4.  
  5. error_open_in db "Error: Cannot open input file.", 10, 0
  6. len_error_open_in equ $ - error_open_in ; Подсчитываем длину строки error_open_in
  7.  
  8. error_open_out db "Error: Cannot open output file.", 10, 0
  9. len_error_open_out equ $ - error_open_out ; Подсчитываем длину строки error_open_out
  10.  
  11. section .bss
  12. bytes_read resd 1
  13. bytes_written resd 1
  14. buffer resb 1024 ; Буфер для чтения
  15. buffer_size equ 1024 ; Размер буфера
  16.  
  17. section .text
  18. global _start
  19.  
  20. _start:
  21. ; Проверка количества аргументов
  22. mov eax, dword [esp+4] ; argc
  23. cmp eax, 4 ; argc должно быть 4
  24. je process_args
  25.  
  26. ; Вывод использования программы
  27. mov eax, 4 ; sys_write
  28. mov ebx, 1 ; stdout
  29. mov ecx, usage ; Адрес строки
  30. mov edx, len_usage ; Длина строки
  31. int 0x80 ; Вызов ядра
  32. jmp exit
  33.  
  34. process_args:
  35. ; Получение параметров
  36. mov ebx, dword [esp+8] ; argv[1] (input_file)
  37. mov ecx, dword [esp+12] ; argv[2] (output_file)
  38. mov edx, dword [esp+16] ; argv[3] (shift)
  39.  
  40. ; Открыть входной файл
  41. mov eax, 5 ; sys_open
  42. mov edi, ebx ; input_file
  43. mov esi, 0 ; O_RDONLY
  44. int 0x80
  45. cmp eax, 0 ; Проверка ошибки
  46. jl error_open_input
  47. mov ebx, eax ; Сохраняем дескриптор входного файла
  48.  
  49. ; Открыть выходной файл
  50. mov eax, 5 ; sys_open
  51. mov edi, ecx ; output_file
  52. mov esi, 578 ; O_WRONLY | O_CREAT | O_TRUNC (0666)
  53. mov ebp, 0666 ; Права доступа
  54. int 0x80
  55. cmp eax, 0 ; Проверка ошибки
  56. jl error_open_output
  57. mov ecx, eax ; Сохраняем дескриптор выходного файла
  58.  
  59. ; Получить сдвиг
  60. mov eax, edx ; shift
  61. sub eax, '0' ; Преобразуем ASCII в число
  62. mov edx, eax ; Сохраняем сдвиг в edx
  63.  
  64. read_loop:
  65. ; Чтение из входного файла
  66. mov eax, 3 ; sys_read
  67. mov ebx, ebx ; Дескриптор входного файла
  68. mov ecx, buffer ; Буфер для чтения
  69. mov edx, buffer_size ; Размер буфера
  70. int 0x80
  71. cmp eax, 0 ; EOF или ошибка
  72. jle close_files
  73. mov dword [bytes_read], eax
  74.  
  75. ; Обработка данных
  76. mov esi, buffer ; Указатель на буфер
  77. mov ecx, dword [bytes_read] ; Количество прочитанных байт
  78. process_char:
  79. mov al, byte [esi] ; Получить символ
  80. cmp al, 'A' ; Проверить верхний регистр
  81. jb skip_char
  82. cmp al, 'Z'
  83. ja check_lower
  84. ; Верхний регистр
  85. sub al, 'A'
  86. mov ebx, 26 ; Делитель для циклического сдвига
  87. div bl ; Делим на 26
  88. add al, 'A'
  89. jmp store_char
  90. check_lower:
  91. cmp al, 'a'
  92. jb skip_char
  93. cmp al, 'z'
  94. ja skip_char
  95. ; Нижний регистр
  96. sub al, 'a'
  97. mov ebx, 26 ; Делитель для циклического сдвига
  98. div bl ; Делим на 26
  99. add al, 'a'
  100. store_char:
  101. mov byte [esi], al ; Сохранить символ
  102. skip_char:
  103. inc esi
  104. loop process_char
  105.  
  106. ; Запись в выходной файл
  107. mov eax, 4 ; sys_write
  108. mov ebx, ecx ; Дескриптор выходного файла
  109. mov ecx, buffer ; Буфер для записи
  110. mov edx, dword [bytes_read] ; Количество записываемых байт
  111. int 0x80
  112. jmp read_loop
  113.  
  114. close_files:
  115. ; Закрытие файлов
  116. mov eax, 6 ; sys_close
  117. mov ebx, ebx ; Закрываем входной файл
  118. int 0x80
  119. mov eax, 6 ; sys_close
  120. mov ebx, ecx ; Закрываем выходной файл
  121. int 0x80
  122.  
  123. exit:
  124. mov eax, 1 ; sys_exit
  125. xor ebx, ebx ; Код возврата 0
  126. int 0x80
  127.  
  128. error_open_input:
  129. mov eax, 4 ; sys_write
  130. mov ebx, 1 ; stdout
  131. mov ecx, error_open_in ; Сообщение об ошибке
  132. mov edx, len_error_open_in ; Длина сообщения
  133. int 0x80
  134. jmp exit
  135.  
  136. error_open_output:
  137. mov eax, 4 ; sys_write
  138. mov ebx, 1 ; stdout
  139. mov ecx, error_open_out ; Сообщение об ошибке
  140. mov edx, len_error_open_out ; Длина сообщения
  141. int 0x80
  142. jmp exit
  143.  
Success #stdin #stdout 0s 5280KB
stdin
Standard input is empty
stdout
Usage: ./caesar {input_file} {output_file} {shift}