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_read db "Error: Failed to read file.", 10, 0
  5. newline db 10
  6.  
  7. section .bss
  8. buffer resb 1024
  9.  
  10. section .text
  11. global _start
  12.  
  13. _start:
  14. ; Проверка наличия аргументов командной строки
  15. mov eax, [esp + 4] ; argc
  16. cmp eax, 2 ; argc должно быть >= 2
  17. jae open_file ; Если да, перейти к открытию файла
  18.  
  19. ; Вывод ошибки: файл не указан
  20. mov eax, 4 ; sys_write
  21. mov ebx, 1 ; stdout
  22. mov ecx, error_no_arg ; сообщение об ошибке
  23. mov edx, 26 ; длина сообщения
  24. int 0x80
  25. jmp exit_program
  26.  
  27. open_file:
  28. mov eax, 5 ; sys_open
  29. lea ebx, [esp + 8] ; Загрузка адреса argv[1]
  30. mov ecx, 0 ; O_RDONLY
  31. int 0x80
  32. cmp eax, 0 ; Проверить, успешно ли открыт файл
  33. jl file_open_error ; Если ошибка, перейти к обработке
  34. mov ebx, eax ; Сохраняем файловый дескриптор в ebx
  35.  
  36. read_file:
  37. mov eax, 3 ; sys_read
  38. mov ecx, buffer ; Указатель на буфер
  39. mov edx, 1024 ; Количество байт для чтения
  40. int 0x80
  41. cmp eax, 0 ; Проверка: достигнут конец файла?
  42. jle file_read_error ; Если ошибка, перейти к обработке
  43.  
  44. ; Поиск второй строки
  45. mov esi, buffer ; esi указывает на начало буфера
  46. xor ecx, ecx ; Счетчик строк
  47.  
  48. find_second_line:
  49. mov al, byte [esi] ; Читаем символ из буфера
  50. cmp al, 0 ; Если достигнут конец данных, выходим
  51. je end_of_buffer
  52. cmp al, [newline] ; Проверяем символ новой строки
  53. jne skip_char
  54.  
  55. inc ecx ; Увеличиваем счетчик строк
  56. cmp ecx, 2 ; Достигли второй строки?
  57. je print_second_line
  58.  
  59. skip_char:
  60. inc esi ; Следующий символ
  61. jmp find_second_line
  62.  
  63. print_second_line:
  64. ; Печатаем вторую строку
  65. mov edx, 0 ; Считаем длину второй строки
  66. find_line_end:
  67. mov al, byte [esi + edx]
  68. cmp al, 0 ; Конец данных?
  69. je do_write
  70. cmp al, [newline] ; Конец строки?
  71. je do_write
  72. inc edx ; Увеличиваем длину строки
  73. jmp find_line_end
  74.  
  75. do_write:
  76. mov eax, 4 ; sys_write
  77. mov ebx, 1 ; stdout
  78. lea ecx, [esi] ; Указатель на начало второй строки
  79. int 0x80
  80. jmp close_file
  81.  
  82. end_of_buffer:
  83. close_file:
  84. mov eax, 6 ; sys_close
  85. int 0x80
  86. jmp exit_program
  87.  
  88. file_open_error:
  89. ; Вывод ошибки: не удалось открыть файл
  90. mov eax, 4 ; sys_write
  91. mov ebx, 1 ; stdout
  92. mov ecx, error_open ; сообщение об ошибке
  93. mov edx, 30 ; длина сообщения
  94. int 0x80
  95. jmp exit_program
  96.  
  97. file_read_error:
  98. ; Вывод ошибки: не удалось прочитать файл
  99. mov eax, 4 ; sys_write
  100. mov ebx, 1 ; stdout
  101. mov ecx, error_read ; сообщение об ошибке
  102. mov edx, 29 ; длина сообщения
  103. int 0x80
  104.  
  105. exit_program:
  106. mov eax, 1 ; sys_exit
  107. xor ebx, ebx ; Код завершения: 0
  108. int 0x80
  109.  
Success #stdin #stdout 0.01s 5276KB
stdin
Standard input is empty
stdout
Error: Could not open file.
E