section .data
error_no_arg db "Error: File not specified.", 10, 0
error_open db "Error: Could not open file.", 10, 0
error_open_code db "Open failed with error code: ", 0
error_read db "Error: Failed to read file.", 10, 0
newline db 10
section .bss
buffer resb 1024
error_code resb 4
section .text
global _start
_start:
; Проверка наличия аргументов командной строки
mov eax, [esp + 4] ; argc
cmp eax, 2 ; argc должно быть >= 2
jae open_file ; Если да, перейти к открытию файла
; Вывод ошибки: файл не указан
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, error_no_arg ; сообщение об ошибке
mov edx, 26 ; длина сообщения
int 0x80
jmp exit_program
open_file:
; Отладка: выводим имя файла (argv[1])
lea ebx, [esp + 8] ; Загрузка адреса argv[1]
mov eax, 4 ; sys_write
mov ecx, ebx ; Указатель на имя файла
mov edx, 100 ; Ограничение на длину строки
int 0x80
; Попытка открыть файл
mov eax, 5 ; sys_open
lea ebx, [esp + 8] ; Загрузка адреса argv[1]
mov ecx, 0 ; O_RDONLY
int 0x80
; Проверка, был ли файл открыт успешно
cmp eax, 0 ; Проверка, что eax содержит файловый дескриптор >= 0
jl file_open_error ; Если ошибка, перейти к обработке
; Сохраняем файловый дескриптор в ebx
mov ebx, eax
; Выводим информацию о том, что файл успешно открыт
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
lea ecx, [esp + 8] ; Указатель на имя файла
mov edx, 100 ; Ограничение на длину строки
int 0x80
read_file:
mov eax, 3 ; sys_read
mov ecx, buffer ; Указатель на буфер
mov edx, 1024 ; Количество байт для чтения
int 0x80
cmp eax, 0 ; Проверка: достигнут конец файла?
jle file_read_error ; Если ошибка, перейти к обработке
; Поиск второй строки
mov esi, buffer ; esi указывает на начало буфера
xor ecx, ecx ; Счетчик строк
find_second_line:
mov al, byte [esi] ; Читаем символ из буфера
cmp al, 0 ; Если достигнут конец данных, выходим
je end_of_buffer
cmp al, [newline] ; Проверяем символ новой строки
jne skip_char
inc ecx ; Увеличиваем счетчик строк
cmp ecx, 2 ; Достигли второй строки?
je print_second_line
skip_char:
inc esi ; Следующий символ
jmp find_second_line
print_second_line:
; Печатаем вторую строку
mov edx, 0 ; Считаем длину второй строки
find_line_end:
mov al, byte [esi + edx]
cmp al, 0 ; Конец данных?
je do_write
cmp al, [newline] ; Конец строки?
je do_write
inc edx ; Увеличиваем длину строки
jmp find_line_end
do_write:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
lea ecx, [esi] ; Указатель на начало второй строки
int 0x80
jmp close_file
end_of_buffer:
close_file:
; Закрытие файла
mov eax, 6 ; sys_close
mov ebx, [esp + 4] ; Дескриптор файла, сохраняем в ebx
int 0x80
jmp exit_program
file_open_error:
; Вывод ошибки: не удалось открыть файл
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, error_open ; сообщение об ошибке
mov edx, 30 ; длина сообщения
int 0x80
; Печатаем код ошибки
mov eax, 5 ; sys_open возвращает код ошибки в eax
lea ebx, [error_code] ; Указатель на переменную для хранения кода ошибки
mov [error_code], eax ; Сохраняем код ошибки в переменной
mov eax, [error_code] ; Загружаем код ошибки
; Преобразуем код ошибки в строку и выводим
call print_error_code
jmp exit_program
file_read_error:
; Вывод ошибки: не удалось прочитать файл
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, error_read ; сообщение об ошибке
mov edx, 29 ; длина сообщения
int 0x80
exit_program:
; Завершаем программу
mov eax, 1 ; sys_exit
xor ebx, ebx ; Код завершения: 0
int 0x80
print_error_code:
; Печатает код ошибки в виде строки
; Ожидается, что eax содержит код ошибки
add eax, '0' ; Преобразуем код ошибки в символ
mov [error_code], al ; Записываем символ в буфер
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
lea ecx, [error_code] ; Указатель на буфер с кодом ошибки
mov edx, 1 ; Размер выводимого символа
int 0x80
ret
c2VjdGlvbiAuZGF0YQogICAgZXJyb3Jfbm9fYXJnIGRiICJFcnJvcjogRmlsZSBub3Qgc3BlY2lmaWVkLiIsIDEwLCAwCiAgICBlcnJvcl9vcGVuIGRiICJFcnJvcjogQ291bGQgbm90IG9wZW4gZmlsZS4iLCAxMCwgMAogICAgZXJyb3Jfb3Blbl9jb2RlIGRiICJPcGVuIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICIsIDAKICAgIGVycm9yX3JlYWQgZGIgIkVycm9yOiBGYWlsZWQgdG8gcmVhZCBmaWxlLiIsIDEwLCAwCiAgICBuZXdsaW5lIGRiIDEwCgpzZWN0aW9uIC5ic3MKICAgIGJ1ZmZlciByZXNiIDEwMjQKICAgIGVycm9yX2NvZGUgcmVzYiA0CgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7INCf0YDQvtCy0LXRgNC60LAg0L3QsNC70LjRh9C40Y8g0LDRgNCz0YPQvNC10L3RgtC+0LIg0LrQvtC80LDQvdC00L3QvtC5INGB0YLRgNC+0LrQuAogICAgbW92IGVheCwgW2VzcCArIDRdICAgICAgICAgICAgICA7IGFyZ2MKICAgIGNtcCBlYXgsIDIgICAgICAgICAgICAgICAgICAgICAgOyBhcmdjINC00L7Qu9C20L3QviDQsdGL0YLRjCA+PSAyCiAgICBqYWUgb3Blbl9maWxlICAgICAgICAgICAgICAgICAgIDsg0JXRgdC70Lgg0LTQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7RgtC60YDRi9GC0LjRjiDRhNCw0LnQu9CwCgogICAgOyDQktGL0LLQvtC0INC+0YjQuNCx0LrQuDog0YTQsNC50Lsg0L3QtSDRg9C60LDQt9Cw0L0KICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIG1vdiBlY3gsIGVycm9yX25vX2FyZyAgICAgICAgICAgOyDRgdC+0L7QsdGJ0LXQvdC40LUg0L7QsSDQvtGI0LjQsdC60LUKICAgIG1vdiBlZHgsIDI2ICAgICAgICAgICAgICAgICAgICAgOyDQtNC70LjQvdCwINGB0L7QvtCx0YnQtdC90LjRjwogICAgaW50IDB4ODAKICAgIGptcCBleGl0X3Byb2dyYW0KCm9wZW5fZmlsZToKICAgIDsg0J7RgtC70LDQtNC60LA6INCy0YvQstC+0LTQuNC8INC40LzRjyDRhNCw0LnQu9CwIChhcmd2WzFdKQogICAgbGVhIGVieCwgW2VzcCArIDhdICAgICAgICAgICAgICA7INCX0LDQs9GA0YPQt9C60LAg0LDQtNGA0LXRgdCwIGFyZ3ZbMV0KICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlY3gsIGVieCAgICAgICAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQuNC80Y8g0YTQsNC50LvQsAogICAgbW92IGVkeCwgMTAwICAgICAgICAgICAgICAgICAgICA7INCe0LPRgNCw0L3QuNGH0LXQvdC40LUg0L3QsCDQtNC70LjQvdGDINGB0YLRgNC+0LrQuAogICAgaW50IDB4ODAKCiAgICA7INCf0L7Qv9GL0YLQutCwINC+0YLQutGA0YvRgtGMINGE0LDQudC7CiAgICBtb3YgZWF4LCA1ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX29wZW4KICAgIGxlYSBlYngsIFtlc3AgKyA4XSAgICAgICAgICAgICAgOyDQl9Cw0LPRgNGD0LfQutCwINCw0LTRgNC10YHQsCBhcmd2WzFdCiAgICBtb3YgZWN4LCAwICAgICAgICAgICAgICAgICAgICAgIDsgT19SRE9OTFkKICAgIGludCAweDgwCgogICAgOyDQn9GA0L7QstC10YDQutCwLCDQsdGL0Lsg0LvQuCDRhNCw0LnQuyDQvtGC0LrRgNGL0YIg0YPRgdC/0LXRiNC90L4KICAgIGNtcCBlYXgsIDAgICAgICAgICAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDQutCwLCDRh9GC0L4gZWF4INGB0L7QtNC10YDQttC40YIg0YTQsNC50LvQvtCy0YvQuSDQtNC10YHQutGA0LjQv9GC0L7RgCA+PSAwCiAgICBqbCBmaWxlX29wZW5fZXJyb3IgICAgICAgICAgICAgIDsg0JXRgdC70Lgg0L7RiNC40LHQutCwLCDQv9C10YDQtdC50YLQuCDQuiDQvtCx0YDQsNCx0L7RgtC60LUKCiAgICA7INCh0L7RhdGA0LDQvdGP0LXQvCDRhNCw0LnQu9C+0LLRi9C5INC00LXRgdC60YDQuNC/0YLQvtGAINCyIGVieAogICAgbW92IGVieCwgZWF4CgogICAgOyDQktGL0LLQvtC00LjQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDRgtC+0LwsINGH0YLQviDRhNCw0LnQuyDRg9GB0L/QtdGI0L3QviDQvtGC0LrRgNGL0YIKICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIGxlYSBlY3gsIFtlc3AgKyA4XSAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQuNC80Y8g0YTQsNC50LvQsAogICAgbW92IGVkeCwgMTAwICAgICAgICAgICAgICAgICAgICA7INCe0LPRgNCw0L3QuNGH0LXQvdC40LUg0L3QsCDQtNC70LjQvdGDINGB0YLRgNC+0LrQuAogICAgaW50IDB4ODAKCnJlYWRfZmlsZToKICAgIG1vdiBlYXgsIDMgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfcmVhZAogICAgbW92IGVjeCwgYnVmZmVyICAgICAgICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINCx0YPRhNC10YAKICAgIG1vdiBlZHgsIDEwMjQgICAgICAgICAgICAgICAgICAgOyDQmtC+0LvQuNGH0LXRgdGC0LLQviDQsdCw0LnRgiDQtNC70Y8g0YfRgtC10L3QuNGPCiAgICBpbnQgMHg4MAogICAgY21wIGVheCwgMCAgICAgICAgICAgICAgICAgICAgICA7INCf0YDQvtCy0LXRgNC60LA6INC00L7RgdGC0LjQs9C90YPRgiDQutC+0L3QtdGGINGE0LDQudC70LA/CiAgICBqbGUgZmlsZV9yZWFkX2Vycm9yICAgICAgICAgICAgIDsg0JXRgdC70Lgg0L7RiNC40LHQutCwLCDQv9C10YDQtdC50YLQuCDQuiDQvtCx0YDQsNCx0L7RgtC60LUKCiAgICA7INCf0L7QuNGB0Log0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuAogICAgbW92IGVzaSwgYnVmZmVyICAgICAgICAgICAgICAgICA7IGVzaSDRg9C60LDQt9GL0LLQsNC10YIg0L3QsCDQvdCw0YfQsNC70L4g0LHRg9GE0LXRgNCwCiAgICB4b3IgZWN4LCBlY3ggICAgICAgICAgICAgICAgICAgIDsg0KHRh9C10YLRh9C40Log0YHRgtGA0L7QugoKZmluZF9zZWNvbmRfbGluZToKICAgIG1vdiBhbCwgYnl0ZSBbZXNpXSAgICAgICAgICAgICAgOyDQp9C40YLQsNC10Lwg0YHQuNC80LLQvtC7INC40Lcg0LHRg9GE0LXRgNCwCiAgICBjbXAgYWwsIDAgICAgICAgICAgICAgICAgICAgICAgIDsg0JXRgdC70Lgg0LTQvtGB0YLQuNCz0L3Rg9GCINC60L7QvdC10YYg0LTQsNC90L3Ri9GFLCDQstGL0YXQvtC00LjQvAogICAgamUgZW5kX29mX2J1ZmZlcgogICAgY21wIGFsLCBbbmV3bGluZV0gICAgICAgICAgICAgICA7INCf0YDQvtCy0LXRgNGP0LXQvCDRgdC40LzQstC+0Lsg0L3QvtCy0L7QuSDRgdGC0YDQvtC60LgKICAgIGpuZSBza2lwX2NoYXIKCiAgICBpbmMgZWN4ICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KPQstC10LvQuNGH0LjQstCw0LXQvCDRgdGH0LXRgtGH0LjQuiDRgdGC0YDQvtC6CiAgICBjbXAgZWN4LCAyICAgICAgICAgICAgICAgICAgICAgIDsg0JTQvtGB0YLQuNCz0LvQuCDQstGC0L7RgNC+0Lkg0YHRgtGA0L7QutC4PwogICAgamUgcHJpbnRfc2Vjb25kX2xpbmUKCnNraXBfY2hhcjoKICAgIGluYyBlc2kgICAgICAgICAgICAgICAgICAgICAgICAgOyDQodC70LXQtNGD0Y7RidC40Lkg0YHQuNC80LLQvtC7CiAgICBqbXAgZmluZF9zZWNvbmRfbGluZQoKcHJpbnRfc2Vjb25kX2xpbmU6CiAgICA7INCf0LXRh9Cw0YLQsNC10Lwg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgwogICAgbW92IGVkeCwgMCAgICAgICAgICAgICAgICAgICAgICA7INCh0YfQuNGC0LDQtdC8INC00LvQuNC90YMg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuApmaW5kX2xpbmVfZW5kOgogICAgbW92IGFsLCBieXRlIFtlc2kgKyBlZHhdCiAgICBjbXAgYWwsIDAgICAgICAgICAgICAgICAgICAgICAgIDsg0JrQvtC90LXRhiDQtNCw0L3QvdGL0YU/CiAgICBqZSBkb193cml0ZQogICAgY21wIGFsLCBbbmV3bGluZV0gICAgICAgICAgICAgICA7INCa0L7QvdC10YYg0YHRgtGA0L7QutC4PwogICAgamUgZG9fd3JpdGUKICAgIGluYyBlZHggICAgICAgICAgICAgICAgICAgICAgICAgOyDQo9Cy0LXQu9C40YfQuNCy0LDQtdC8INC00LvQuNC90YMg0YHRgtGA0L7QutC4CiAgICBqbXAgZmluZF9saW5lX2VuZAoKZG9fd3JpdGU6CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBsZWEgZWN4LCBbZXNpXSAgICAgICAgICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0L3QsNGH0LDQu9C+INCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKICAgIGludCAweDgwCiAgICBqbXAgY2xvc2VfZmlsZQoKZW5kX29mX2J1ZmZlcjoKY2xvc2VfZmlsZToKICAgIDsg0JfQsNC60YDRi9GC0LjQtSDRhNCw0LnQu9CwCiAgICBtb3YgZWF4LCA2ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX2Nsb3NlCiAgICBtb3YgZWJ4LCBbZXNwICsgNF0gICAgICAgICAgICAgIDsg0JTQtdGB0LrRgNC40L/RgtC+0YAg0YTQsNC50LvQsCwg0YHQvtGF0YDQsNC90Y/QtdC8INCyIGVieAogICAgaW50IDB4ODAKICAgIGptcCBleGl0X3Byb2dyYW0KCmZpbGVfb3Blbl9lcnJvcjoKICAgIDsg0JLRi9Cy0L7QtCDQvtGI0LjQsdC60Lg6INC90LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0YTQsNC50LsKICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIG1vdiBlY3gsIGVycm9yX29wZW4gICAgICAgICAgICAgOyDRgdC+0L7QsdGJ0LXQvdC40LUg0L7QsSDQvtGI0LjQsdC60LUKICAgIG1vdiBlZHgsIDMwICAgICAgICAgICAgICAgICAgICAgOyDQtNC70LjQvdCwINGB0L7QvtCx0YnQtdC90LjRjwogICAgaW50IDB4ODAKCiAgICA7INCf0LXRh9Cw0YLQsNC10Lwg0LrQvtC0INC+0YjQuNCx0LrQuAogICAgbW92IGVheCwgNSAgICAgICAgICAgICAgICAgICAgICA7IHN5c19vcGVuINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7QtCDQvtGI0LjQsdC60Lgg0LIgZWF4CiAgICBsZWEgZWJ4LCBbZXJyb3JfY29kZV0gICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0L/QtdGA0LXQvNC10L3QvdGD0Y4g0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0LrQvtC00LAg0L7RiNC40LHQutC4CiAgICBtb3YgW2Vycm9yX2NvZGVdLCBlYXggICAgICAgICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0LrQvtC0INC+0YjQuNCx0LrQuCDQsiDQv9C10YDQtdC80LXQvdC90L7QuQogICAgbW92IGVheCwgW2Vycm9yX2NvZGVdICAgICAgICAgICA7INCX0LDQs9GA0YPQttCw0LXQvCDQutC+0LQg0L7RiNC40LHQutC4CiAgICA7INCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0LrQvtC0INC+0YjQuNCx0LrQuCDQsiDRgdGC0YDQvtC60YMg0Lgg0LLRi9Cy0L7QtNC40LwKICAgIGNhbGwgcHJpbnRfZXJyb3JfY29kZQoKICAgIGptcCBleGl0X3Byb2dyYW0KCmZpbGVfcmVhZF9lcnJvcjoKICAgIDsg0JLRi9Cy0L7QtCDQvtGI0LjQsdC60Lg6INC90LUg0YPQtNCw0LvQvtGB0Ywg0L/RgNC+0YfQuNGC0LDRgtGMINGE0LDQudC7CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBtb3YgZWN4LCBlcnJvcl9yZWFkICAgICAgICAgICAgIDsg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1CiAgICBtb3YgZWR4LCAyOSAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdC+0L7QsdGJ0LXQvdC40Y8KICAgIGludCAweDgwCgpleGl0X3Byb2dyYW06CiAgICA7INCX0LDQstC10YDRiNCw0LXQvCDQv9GA0L7Qs9GA0LDQvNC80YMKICAgIG1vdiBlYXgsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfZXhpdAogICAgeG9yIGVieCwgZWJ4ICAgICAgICAgICAgICAgICAgICA7INCa0L7QtCDQt9Cw0LLQtdGA0YjQtdC90LjRjzogMAogICAgaW50IDB4ODAKCnByaW50X2Vycm9yX2NvZGU6CiAgICA7INCf0LXRh9Cw0YLQsNC10YIg0LrQvtC0INC+0YjQuNCx0LrQuCDQsiDQstC40LTQtSDRgdGC0YDQvtC60LgKICAgIDsg0J7QttC40LTQsNC10YLRgdGPLCDRh9GC0L4gZWF4INGB0L7QtNC10YDQttC40YIg0LrQvtC0INC+0YjQuNCx0LrQuAogICAgYWRkIGVheCwgJzAnICAgICAgICAgICAgICAgICAgICA7INCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0LrQvtC0INC+0YjQuNCx0LrQuCDQsiDRgdC40LzQstC+0LsKICAgIG1vdiBbZXJyb3JfY29kZV0sIGFsICAgICAgICAgICAgOyDQl9Cw0L/QuNGB0YvQstCw0LXQvCDRgdC40LzQstC+0Lsg0LIg0LHRg9GE0LXRgAogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbGVhIGVjeCwgW2Vycm9yX2NvZGVdICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINCx0YPRhNC10YAg0YEg0LrQvtC00L7QvCDQvtGI0LjQsdC60LgKICAgIG1vdiBlZHgsIDEgICAgICAgICAgICAgICAgICAgICAgOyDQoNCw0LfQvNC10YAg0LLRi9Cy0L7QtNC40LzQvtCz0L4g0YHQuNC80LLQvtC70LAKICAgIGludCAweDgwCiAgICByZXQK