fork download
  1. section .data
  2. error_no_arg db "Error: File not specified.", 10, 0
  3. error_open db "Error: Could not open file.", 10, 0
  4. error_open_code db "Open failed with error code: ", 0
  5. error_read db "Error: Failed to read file.", 10, 0
  6. newline db 10
  7.  
  8. section .bss
  9. buffer resb 1024
  10. error_code resb 4
  11.  
  12. section .text
  13. global _start
  14.  
  15. _start:
  16. ; Проверка наличия аргументов командной строки
  17. mov eax, [esp + 4] ; argc
  18. cmp eax, 2 ; argc должно быть >= 2
  19. jae open_file ; Если да, перейти к открытию файла
  20.  
  21. ; Вывод ошибки: файл не указан
  22. mov eax, 4 ; sys_write
  23. mov ebx, 1 ; stdout
  24. mov ecx, error_no_arg ; сообщение об ошибке
  25. mov edx, 26 ; длина сообщения
  26. int 0x80
  27. jmp exit_program
  28.  
  29. open_file:
  30. ; Отладка: выводим имя файла (argv[1])
  31. lea ebx, [esp + 8] ; Загрузка адреса argv[1]
  32. mov eax, 4 ; sys_write
  33. mov ecx, ebx ; Указатель на имя файла
  34. mov edx, 100 ; Ограничение на длину строки
  35. int 0x80
  36.  
  37. ; Попытка открыть файл
  38. mov eax, 5 ; sys_open
  39. lea ebx, [esp + 8] ; Загрузка адреса argv[1]
  40. mov ecx, 0 ; O_RDONLY
  41. int 0x80
  42.  
  43. ; Проверка, был ли файл открыт успешно
  44. cmp eax, 0 ; Проверка, что eax содержит файловый дескриптор >= 0
  45. jl file_open_error ; Если ошибка, перейти к обработке
  46.  
  47. ; Выводим информацию о том, что файл успешно открыт
  48. mov eax, 4 ; sys_write
  49. mov ebx, 1 ; stdout
  50. lea ecx, [esp + 8] ; Указатель на имя файла
  51. mov edx, 100 ; Ограничение на длину строки
  52. int 0x80
  53. mov ebx, eax ; Сохраняем файловый дескриптор в ebx
  54.  
  55. read_file:
  56. mov eax, 3 ; sys_read
  57. mov ecx, buffer ; Указатель на буфер
  58. mov edx, 1024 ; Количество байт для чтения
  59. int 0x80
  60. cmp eax, 0 ; Проверка: достигнут конец файла?
  61. jle file_read_error ; Если ошибка, перейти к обработке
  62.  
  63. ; Поиск второй строки
  64. mov esi, buffer ; esi указывает на начало буфера
  65. xor ecx, ecx ; Счетчик строк
  66.  
  67. find_second_line:
  68. mov al, byte [esi] ; Читаем символ из буфера
  69. cmp al, 0 ; Если достигнут конец данных, выходим
  70. je end_of_buffer
  71. cmp al, [newline] ; Проверяем символ новой строки
  72. jne skip_char
  73.  
  74. inc ecx ; Увеличиваем счетчик строк
  75. cmp ecx, 2 ; Достигли второй строки?
  76. je print_second_line
  77.  
  78. skip_char:
  79. inc esi ; Следующий символ
  80. jmp find_second_line
  81.  
  82. print_second_line:
  83. ; Печатаем вторую строку
  84. mov edx, 0 ; Считаем длину второй строки
  85. find_line_end:
  86. mov al, byte [esi + edx]
  87. cmp al, 0 ; Конец данных?
  88. je do_write
  89. cmp al, [newline] ; Конец строки?
  90. je do_write
  91. inc edx ; Увеличиваем длину строки
  92. jmp find_line_end
  93.  
  94. do_write:
  95. mov eax, 4 ; sys_write
  96. mov ebx, 1 ; stdout
  97. lea ecx, [esi] ; Указатель на начало второй строки
  98. int 0x80
  99. jmp close_file
  100.  
  101. end_of_buffer:
  102. close_file:
  103. mov eax, 6 ; sys_close
  104. int 0x80
  105. jmp exit_program
  106.  
  107. file_open_error:
  108. ; Вывод ошибки: не удалось открыть файл
  109. mov eax, 4 ; sys_write
  110. mov ebx, 1 ; stdout
  111. mov ecx, error_open ; сообщение об ошибке
  112. mov edx, 30 ; длина сообщения
  113. int 0x80
  114.  
  115. ; Печатаем код ошибки
  116. mov eax, 5 ; sys_open возвращает код ошибки в eax
  117. lea ebx, [error_code] ; Указатель на переменную для хранения кода ошибки
  118. mov [error_code], eax ; Сохраняем код ошибки в переменной
  119. mov eax, [error_code] ; Загружаем код ошибки
  120. ; Преобразуем код ошибки в строку и выводим
  121. call print_error_code
  122.  
  123. jmp exit_program
  124.  
  125. file_read_error:
  126. ; Вывод ошибки: не удалось прочитать файл
  127. mov eax, 4 ; sys_write
  128. mov ebx, 1 ; stdout
  129. mov ecx, error_read ; сообщение об ошибке
  130. mov edx, 29 ; длина сообщения
  131. int 0x80
  132.  
  133. exit_program:
  134. mov eax, 1 ; sys_exit
  135. xor ebx, ebx ; Код завершения: 0
  136. int 0x80
  137.  
  138. print_error_code:
  139. ; Печатает код ошибки в виде строки
  140. ; Ожидается, что eax содержит код ошибки
  141. add eax, '0' ; Преобразуем код ошибки в символ
  142. mov [error_code], al ; Записываем символ в буфер
  143. mov eax, 4 ; sys_write
  144. mov ebx, 1 ; stdout
  145. lea ecx, [error_code] ; Указатель на буфер с кодом ошибки
  146. mov edx, 1 ; Размер выводимого символа
  147. int 0x80
  148. ret
  149.  
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
Error: Could not open file.
O5