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