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 ; Если ошибка, перейти к обработке
; Выводим информацию о том, что файл успешно открыт
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
lea ecx, [esp + 8] ; Указатель на имя файла
mov edx, 100 ; Ограничение на длину строки
int 0x80
mov ebx, eax ; Сохраняем файловый дескриптор в ebx
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
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+0LTQuNC8INC40LzRjyDRhNCw0LnQu9CwIChhcmd2WzFdKQogICAgbGVhIGVieCwgW2VzcCArIDhdICAgICAgICAgICAgICA7INCX0LDQs9GA0YPQt9C60LAg0LDQtNGA0LXRgdCwIGFyZ3ZbMV0KICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlY3gsIGVieCAgICAgICAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQuNC80Y8g0YTQsNC50LvQsAogICAgbW92IGVkeCwgMTAwICAgICAgICAgICAgICAgICAgICAgOyDQntCz0YDQsNC90LjRh9C10L3QuNC1INC90LAg0LTQu9C40L3RgyDRgdGC0YDQvtC60LgKICAgIGludCAweDgwCgogICAgOyDQn9C+0L/Ri9GC0LrQsCDQvtGC0LrRgNGL0YLRjCDRhNCw0LnQuwogICAgbW92IGVheCwgNSAgICAgICAgICAgICAgICAgICAgICA7IHN5c19vcGVuCiAgICBsZWEgZWJ4LCBbZXNwICsgOF0gICAgICAgICAgICAgIDsg0JfQsNCz0YDRg9C30LrQsCDQsNC00YDQtdGB0LAgYXJndlsxXQogICAgbW92IGVjeCwgMCAgICAgICAgICAgICAgICAgICAgICA7IE9fUkRPTkxZCiAgICBpbnQgMHg4MAoKICAgIDsg0J/RgNC+0LLQtdGA0LrQsCwg0LHRi9C7INC70Lgg0YTQsNC50Lsg0L7RgtC60YDRi9GCINGD0YHQv9C10YjQvdC+CiAgICBjbXAgZWF4LCAwICAgICAgICAgICAgICAgICAgICAgIDsg0J/RgNC+0LLQtdGA0LrQsCwg0YfRgtC+IGVheCDRgdC+0LTQtdGA0LbQuNGCINGE0LDQudC70L7QstGL0Lkg0LTQtdGB0LrRgNC40L/RgtC+0YAgPj0gMAogICAgamwgZmlsZV9vcGVuX2Vycm9yICAgICAgICAgICAgICA7INCV0YHQu9C4INC+0YjQuNCx0LrQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7QsdGA0LDQsdC+0YLQutC1CgogICAgOyDQktGL0LLQvtC00LjQvCDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDRgtC+0LwsINGH0YLQviDRhNCw0LnQuyDRg9GB0L/QtdGI0L3QviDQvtGC0LrRgNGL0YIKICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIGxlYSBlY3gsIFtlc3AgKyA4XSAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQuNC80Y8g0YTQsNC50LvQsAogICAgbW92IGVkeCwgMTAwICAgICAgICAgICAgICAgICAgICA7INCe0LPRgNCw0L3QuNGH0LXQvdC40LUg0L3QsCDQtNC70LjQvdGDINGB0YLRgNC+0LrQuAogICAgaW50IDB4ODAKICAgIG1vdiBlYngsIGVheCAgICAgICAgICAgICAgICAgICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0YTQsNC50LvQvtCy0YvQuSDQtNC10YHQutGA0LjQv9GC0L7RgCDQsiBlYngKCnJlYWRfZmlsZToKICAgIG1vdiBlYXgsIDMgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfcmVhZAogICAgbW92IGVjeCwgYnVmZmVyICAgICAgICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINCx0YPRhNC10YAKICAgIG1vdiBlZHgsIDEwMjQgICAgICAgICAgICAgICAgICAgOyDQmtC+0LvQuNGH0LXRgdGC0LLQviDQsdCw0LnRgiDQtNC70Y8g0YfRgtC10L3QuNGPCiAgICBpbnQgMHg4MAogICAgY21wIGVheCwgMCAgICAgICAgICAgICAgICAgICAgICA7INCf0YDQvtCy0LXRgNC60LA6INC00L7RgdGC0LjQs9C90YPRgiDQutC+0L3QtdGGINGE0LDQudC70LA/CiAgICBqbGUgZmlsZV9yZWFkX2Vycm9yICAgICAgICAgICAgIDsg0JXRgdC70Lgg0L7RiNC40LHQutCwLCDQv9C10YDQtdC50YLQuCDQuiDQvtCx0YDQsNCx0L7RgtC60LUKCiAgICA7INCf0L7QuNGB0Log0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuAogICAgbW92IGVzaSwgYnVmZmVyICAgICAgICAgICAgICAgICA7IGVzaSDRg9C60LDQt9GL0LLQsNC10YIg0L3QsCDQvdCw0YfQsNC70L4g0LHRg9GE0LXRgNCwCiAgICB4b3IgZWN4LCBlY3ggICAgICAgICAgICAgICAgICAgIDsg0KHRh9C10YLRh9C40Log0YHRgtGA0L7QugoKZmluZF9zZWNvbmRfbGluZToKICAgIG1vdiBhbCwgYnl0ZSBbZXNpXSAgICAgICAgICAgICAgOyDQp9C40YLQsNC10Lwg0YHQuNC80LLQvtC7INC40Lcg0LHRg9GE0LXRgNCwCiAgICBjbXAgYWwsIDAgICAgICAgICAgICAgICAgICAgICAgIDsg0JXRgdC70Lgg0LTQvtGB0YLQuNCz0L3Rg9GCINC60L7QvdC10YYg0LTQsNC90L3Ri9GFLCDQstGL0YXQvtC00LjQvAogICAgamUgZW5kX29mX2J1ZmZlcgogICAgY21wIGFsLCBbbmV3bGluZV0gICAgICAgICAgICAgICA7INCf0YDQvtCy0LXRgNGP0LXQvCDRgdC40LzQstC+0Lsg0L3QvtCy0L7QuSDRgdGC0YDQvtC60LgKICAgIGpuZSBza2lwX2NoYXIKCiAgICBpbmMgZWN4ICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KPQstC10LvQuNGH0LjQstCw0LXQvCDRgdGH0LXRgtGH0LjQuiDRgdGC0YDQvtC6CiAgICBjbXAgZWN4LCAyICAgICAgICAgICAgICAgICAgICAgIDsg0JTQvtGB0YLQuNCz0LvQuCDQstGC0L7RgNC+0Lkg0YHRgtGA0L7QutC4PwogICAgamUgcHJpbnRfc2Vjb25kX2xpbmUKCnNraXBfY2hhcjoKICAgIGluYyBlc2kgICAgICAgICAgICAgICAgICAgICAgICAgOyDQodC70LXQtNGD0Y7RidC40Lkg0YHQuNC80LLQvtC7CiAgICBqbXAgZmluZF9zZWNvbmRfbGluZQoKcHJpbnRfc2Vjb25kX2xpbmU6CiAgICA7INCf0LXRh9Cw0YLQsNC10Lwg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgwogICAgbW92IGVkeCwgMCAgICAgICAgICAgICAgICAgICAgICA7INCh0YfQuNGC0LDQtdC8INC00LvQuNC90YMg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuApmaW5kX2xpbmVfZW5kOgogICAgbW92IGFsLCBieXRlIFtlc2kgKyBlZHhdCiAgICBjbXAgYWwsIDAgICAgICAgICAgICAgICAgICAgICAgIDsg0JrQvtC90LXRhiDQtNCw0L3QvdGL0YU/CiAgICBqZSBkb193cml0ZQogICAgY21wIGFsLCBbbmV3bGluZV0gICAgICAgICAgICAgICA7INCa0L7QvdC10YYg0YHRgtGA0L7QutC4PwogICAgamUgZG9fd3JpdGUKICAgIGluYyBlZHggICAgICAgICAgICAgICAgICAgICAgICAgOyDQo9Cy0LXQu9C40YfQuNCy0LDQtdC8INC00LvQuNC90YMg0YHRgtGA0L7QutC4CiAgICBqbXAgZmluZF9saW5lX2VuZAoKZG9fd3JpdGU6CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBsZWEgZWN4LCBbZXNpXSAgICAgICAgICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0L3QsNGH0LDQu9C+INCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKICAgIGludCAweDgwCiAgICBqbXAgY2xvc2VfZmlsZQoKZW5kX29mX2J1ZmZlcjoKY2xvc2VfZmlsZToKICAgIG1vdiBlYXgsIDYgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfY2xvc2UKICAgIGludCAweDgwCiAgICBqbXAgZXhpdF9wcm9ncmFtCgpmaWxlX29wZW5fZXJyb3I6CiAgICA7INCS0YvQstC+0LQg0L7RiNC40LHQutC4OiDQvdC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINGE0LDQudC7CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBtb3YgZWN4LCBlcnJvcl9vcGVuICAgICAgICAgICAgIDsg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1CiAgICBtb3YgZWR4LCAzMCAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdC+0L7QsdGJ0LXQvdC40Y8KICAgIGludCAweDgwCgogICAgOyDQn9C10YfQsNGC0LDQtdC8INC60L7QtCDQvtGI0LjQsdC60LgKICAgIG1vdiBlYXgsIDUgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfb3BlbiDQstC+0LfQstGA0LDRidCw0LXRgiDQutC+0LQg0L7RiNC40LHQutC4INCyIGVheAogICAgbGVhIGVieCwgW2Vycm9yX2NvZGVdICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC/0LXRgNC10LzQtdC90L3Rg9GOINC00LvRjyDRhdGA0LDQvdC10L3QuNGPINC60L7QtNCwINC+0YjQuNCx0LrQuAogICAgbW92IFtlcnJvcl9jb2RlXSwgZWF4ICAgICAgICAgIDsg0KHQvtGF0YDQsNC90Y/QtdC8INC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0L/QtdGA0LXQvNC10L3QvdC+0LkKICAgIG1vdiBlYXgsIFtlcnJvcl9jb2RlXSAgICAgICAgICAgOyDQl9Cw0LPRgNGD0LbQsNC10Lwg0LrQvtC0INC+0YjQuNCx0LrQuAogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0YHRgtGA0L7QutGDINC4INCy0YvQstC+0LTQuNC8CiAgICBjYWxsIHByaW50X2Vycm9yX2NvZGUKCiAgICBqbXAgZXhpdF9wcm9ncmFtCgpmaWxlX3JlYWRfZXJyb3I6CiAgICA7INCS0YvQstC+0LQg0L7RiNC40LHQutC4OiDQvdC1INGD0LTQsNC70L7RgdGMINC/0YDQvtGH0LjRgtCw0YLRjCDRhNCw0LnQuwogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbW92IGVjeCwgZXJyb3JfcmVhZCAgICAgICAgICAgICA7INGB0L7QvtCx0YnQtdC90LjQtSDQvtCxINC+0YjQuNCx0LrQtQogICAgbW92IGVkeCwgMjkgICAgICAgICAgICAgICAgICAgICA7INC00LvQuNC90LAg0YHQvtC+0LHRidC10L3QuNGPCiAgICBpbnQgMHg4MAoKZXhpdF9wcm9ncmFtOgogICAgbW92IGVheCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN5c19leGl0CiAgICB4b3IgZWJ4LCBlYnggICAgICAgICAgICAgICAgICAgIDsg0JrQvtC0INC30LDQstC10YDRiNC10L3QuNGPOiAwCiAgICBpbnQgMHg4MAoKcHJpbnRfZXJyb3JfY29kZToKICAgIDsg0J/QtdGH0LDRgtCw0LXRgiDQutC+0LQg0L7RiNC40LHQutC4INCyINCy0LjQtNC1INGB0YLRgNC+0LrQuAogICAgOyDQntC20LjQtNCw0LXRgtGB0Y8sINGH0YLQviBlYXgg0YHQvtC00LXRgNC20LjRgiDQutC+0LQg0L7RiNC40LHQutC4CiAgICBhZGQgZWF4LCAnMCcgICAgICAgICAgICAgICAgICAgIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCDQutC+0LQg0L7RiNC40LHQutC4INCyINGB0LjQvNCy0L7QuwogICAgbW92IFtlcnJvcl9jb2RlXSwgYWwgICAgICAgICAgICA7INCX0LDQv9C40YHRi9Cy0LDQtdC8INGB0LjQvNCy0L7QuyDQsiDQsdGD0YTQtdGACiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBsZWEgZWN4LCBbZXJyb3JfY29kZV0gICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0LHRg9GE0LXRgCDRgSDQutC+0LTQvtC8INC+0YjQuNCx0LrQuAogICAgbW92IGVkeCwgMSAgICAgICAgICAgICAgICAgICAgICA7INCg0LDQt9C80LXRgCDQstGL0LLQvtC00LjQvNC+0LPQviDRgdC40LzQstC+0LvQsAogICAgaW50IDB4ODAKICAgIHJldAo=