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])
mov ebx, [esp + 8] ; Загрузка адреса argv[1] (файл)
mov eax, 4 ; sys_write
mov ecx, ebx ; Указатель на имя файла
mov edx, 100 ; Ограничение на длину строки
int 0x80
; Попытка открыть файл
mov eax, 5 ; sys_open
mov 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+0LTQuNC8INC40LzRjyDRhNCw0LnQu9CwIChhcmd2WzFdKQogICAgbW92IGVieCwgW2VzcCArIDhdICAgICAgICAgICAgICA7INCX0LDQs9GA0YPQt9C60LAg0LDQtNGA0LXRgdCwIGFyZ3ZbMV0gKNGE0LDQudC7KQogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVjeCwgZWJ4ICAgICAgICAgICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC40LzRjyDRhNCw0LnQu9CwCiAgICBtb3YgZWR4LCAxMDAgICAgICAgICAgICAgICAgICAgIDsg0J7Qs9GA0LDQvdC40YfQtdC90LjQtSDQvdCwINC00LvQuNC90YMg0YHRgtGA0L7QutC4CiAgICBpbnQgMHg4MAoKICAgIDsg0J/QvtC/0YvRgtC60LAg0L7RgtC60YDRi9GC0Ywg0YTQsNC50LsKICAgIG1vdiBlYXgsIDUgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfb3BlbgogICAgbW92IGVieCwgW2VzcCArIDhdICAgICAgICAgICAgICA7INCX0LDQs9GA0YPQt9C60LAg0LDQtNGA0LXRgdCwIGFyZ3ZbMV0gKNGE0LDQudC7KQogICAgbW92IGVjeCwgMCAgICAgICAgICAgICAgICAgICAgICA7IE9fUkRPTkxZCiAgICBpbnQgMHg4MAoKICAgIDsg0J/RgNC+0LLQtdGA0LrQsCwg0LHRi9C7INC70Lgg0YTQsNC50Lsg0L7RgtC60YDRi9GCINGD0YHQv9C10YjQvdC+CiAgICBjbXAgZWF4LCAwICAgICAgICAgICAgICAgICAgICAgIDsg0J/RgNC+0LLQtdGA0LrQsCwg0YfRgtC+IGVheCDRgdC+0LTQtdGA0LbQuNGCINGE0LDQudC70L7QstGL0Lkg0LTQtdGB0LrRgNC40L/RgtC+0YAgPj0gMAogICAgamwgZmlsZV9vcGVuX2Vycm9yICAgICAgICAgICAgICA7INCV0YHQu9C4INC+0YjQuNCx0LrQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7QsdGA0LDQsdC+0YLQutC1CgogICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0YTQsNC50LvQvtCy0YvQuSDQtNC10YHQutGA0LjQv9GC0L7RgCDQsiBlYngKICAgIG1vdiBlYngsIGVheAoKICAgIDsg0JLRi9Cy0L7QtNC40Lwg0LjQvdGE0L7RgNC80LDRhtC40Y4g0L4g0YLQvtC8LCDRh9GC0L4g0YTQsNC50Lsg0YPRgdC/0LXRiNC90L4g0L7RgtC60YDRi9GCCiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBsZWEgZWN4LCBbZXNwICsgOF0gICAgICAgICAgICAgIDsg0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0LjQvNGPINGE0LDQudC70LAKICAgIG1vdiBlZHgsIDEwMCAgICAgICAgICAgICAgICAgICAgOyDQntCz0YDQsNC90LjRh9C10L3QuNC1INC90LAg0LTQu9C40L3RgyDRgdGC0YDQvtC60LgKICAgIGludCAweDgwCgpyZWFkX2ZpbGU6CiAgICBtb3YgZWF4LCAzICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3JlYWQKICAgIG1vdiBlY3gsIGJ1ZmZlciAgICAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQsdGD0YTQtdGACiAgICBtb3YgZWR4LCAxMDI0ICAgICAgICAgICAgICAgICAgIDsg0JrQvtC70LjRh9C10YHRgtCy0L4g0LHQsNC50YIg0LTQu9GPINGH0YLQtdC90LjRjwogICAgaW50IDB4ODAKICAgIGNtcCBlYXgsIDAgICAgICAgICAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDQutCwOiDQtNC+0YHRgtC40LPQvdGD0YIg0LrQvtC90LXRhiDRhNCw0LnQu9CwPwogICAgamxlIGZpbGVfcmVhZF9lcnJvciAgICAgICAgICAgICA7INCV0YHQu9C4INC+0YjQuNCx0LrQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7QsdGA0LDQsdC+0YLQutC1CgogICAgOyDQn9C+0LjRgdC6INCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKICAgIG1vdiBlc2ksIGJ1ZmZlciAgICAgICAgICAgICAgICAgOyBlc2kg0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0L3QsNGH0LDQu9C+INCx0YPRhNC10YDQsAogICAgeG9yIGVjeCwgZWN4ICAgICAgICAgICAgICAgICAgICA7INCh0YfQtdGC0YfQuNC6INGB0YLRgNC+0LoKCmZpbmRfc2Vjb25kX2xpbmU6CiAgICBtb3YgYWwsIGJ5dGUgW2VzaV0gICAgICAgICAgICAgIDsg0KfQuNGC0LDQtdC8INGB0LjQvNCy0L7QuyDQuNC3INCx0YPRhNC10YDQsAogICAgY21wIGFsLCAwICAgICAgICAgICAgICAgICAgICAgICA7INCV0YHQu9C4INC00L7RgdGC0LjQs9C90YPRgiDQutC+0L3QtdGGINC00LDQvdC90YvRhSwg0LLRi9GF0L7QtNC40LwKICAgIGplIGVuZF9vZl9idWZmZXIKICAgIGNtcCBhbCwgW25ld2xpbmVdICAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0YHQuNC80LLQvtC7INC90L7QstC+0Lkg0YHRgtGA0L7QutC4CiAgICBqbmUgc2tpcF9jaGFyCgogICAgaW5jIGVjeCAgICAgICAgICAgICAgICAgICAgICAgICA7INCj0LLQtdC70LjRh9C40LLQsNC10Lwg0YHRh9C10YLRh9C40Log0YHRgtGA0L7QugogICAgY21wIGVjeCwgMiAgICAgICAgICAgICAgICAgICAgICA7INCU0L7RgdGC0LjQs9C70Lgg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuD8KICAgIGplIHByaW50X3NlY29uZF9saW5lCgpza2lwX2NoYXI6CiAgICBpbmMgZXNpICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KHQu9C10LTRg9GO0YnQuNC5INGB0LjQvNCy0L7QuwogICAgam1wIGZpbmRfc2Vjb25kX2xpbmUKCnByaW50X3NlY29uZF9saW5lOgogICAgOyDQn9C10YfQsNGC0LDQtdC8INCy0YLQvtGA0YPRjiDRgdGC0YDQvtC60YMKICAgIG1vdiBlZHgsIDAgICAgICAgICAgICAgICAgICAgICAgOyDQodGH0LjRgtCw0LXQvCDQtNC70LjQvdGDINCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKZmluZF9saW5lX2VuZDoKICAgIG1vdiBhbCwgYnl0ZSBbZXNpICsgZWR4XQogICAgY21wIGFsLCAwICAgICAgICAgICAgICAgICAgICAgICA7INCa0L7QvdC10YYg0LTQsNC90L3Ri9GFPwogICAgamUgZG9fd3JpdGUKICAgIGNtcCBhbCwgW25ld2xpbmVdICAgICAgICAgICAgICAgOyDQmtC+0L3QtdGGINGB0YLRgNC+0LrQuD8KICAgIGplIGRvX3dyaXRlCiAgICBpbmMgZWR4ICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KPQstC10LvQuNGH0LjQstCw0LXQvCDQtNC70LjQvdGDINGB0YLRgNC+0LrQuAogICAgam1wIGZpbmRfbGluZV9lbmQKCmRvX3dyaXRlOgogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbGVhIGVjeCwgW2VzaV0gICAgICAgICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC90LDRh9Cw0LvQviDQstGC0L7RgNC+0Lkg0YHRgtGA0L7QutC4CiAgICBpbnQgMHg4MAogICAgam1wIGNsb3NlX2ZpbGUKCmVuZF9vZl9idWZmZXI6CmNsb3NlX2ZpbGU6CiAgICA7INCX0LDQutGA0YvRgtC40LUg0YTQsNC50LvQsAogICAgbW92IGVheCwgNiAgICAgICAgICAgICAgICAgICAgICA7IHN5c19jbG9zZQogICAgbW92IGVieCwgW2VzcCArIDRdICAgICAgICAgICAgICA7INCU0LXRgdC60YDQuNC/0YLQvtGAINGE0LDQudC70LAsINGB0L7RhdGA0LDQvdGP0LXQvCDQsiBlYngKICAgIGludCAweDgwCiAgICBqbXAgZXhpdF9wcm9ncmFtCgpmaWxlX29wZW5fZXJyb3I6CiAgICA7INCS0YvQstC+0LQg0L7RiNC40LHQutC4OiDQvdC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINGE0LDQudC7CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBtb3YgZWN4LCBlcnJvcl9vcGVuICAgICAgICAgICAgIDsg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1CiAgICBtb3YgZWR4LCAzMCAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdC+0L7QsdGJ0LXQvdC40Y8KICAgIGludCAweDgwCgogICAgOyDQn9C10YfQsNGC0LDQtdC8INC60L7QtCDQvtGI0LjQsdC60LgKICAgIG1vdiBlYXgsIDUgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfb3BlbiDQstC+0LfQstGA0LDRidCw0LXRgiDQutC+0LQg0L7RiNC40LHQutC4INCyIGVheAogICAgbGVhIGVieCwgW2Vycm9yX2NvZGVdICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC/0LXRgNC10LzQtdC90L3Rg9GOINC00LvRjyDRhdGA0LDQvdC10L3QuNGPINC60L7QtNCwINC+0YjQuNCx0LrQuAogICAgbW92IFtlcnJvcl9jb2RlXSwgZWF4ICAgICAgICAgIDsg0KHQvtGF0YDQsNC90Y/QtdC8INC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0L/QtdGA0LXQvNC10L3QvdC+0LkKICAgIG1vdiBlYXgsIFtlcnJvcl9jb2RlXSAgICAgICAgICAgOyDQl9Cw0LPRgNGD0LbQsNC10Lwg0LrQvtC0INC+0YjQuNCx0LrQuAogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0YHRgtGA0L7QutGDINC4INCy0YvQstC+0LTQuNC8CiAgICBjYWxsIHByaW50X2Vycm9yX2NvZGUKCiAgICBqbXAgZXhpdF9wcm9ncmFtCgpmaWxlX3JlYWRfZXJyb3I6CiAgICA7INCS0YvQstC+0LQg0L7RiNC40LHQutC4OiDQvdC1INGD0LTQsNC70L7RgdGMINC/0YDQvtGH0LjRgtCw0YLRjCDRhNCw0LnQuwogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbW92IGVjeCwgZXJyb3JfcmVhZCAgICAgICAgICAgICA7INGB0L7QvtCx0YnQtdC90LjQtSDQvtCxINC+0YjQuNCx0LrQtQogICAgbW92IGVkeCwgMjkgICAgICAgICAgICAgICAgICAgICA7INC00LvQuNC90LAg0YHQvtC+0LHRidC10L3QuNGPCiAgICBpbnQgMHg4MAoKZXhpdF9wcm9ncmFtOgogICAgOyDQl9Cw0LLQtdGA0YjQsNC10Lwg0L/RgNC+0LPRgNCw0LzQvNGDCiAgICBtb3YgZWF4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX2V4aXQKICAgIHhvciBlYngsIGVieCAgICAgICAgICAgICAgICAgICAgOyDQmtC+0LQg0LfQsNCy0LXRgNGI0LXQvdC40Y86IDAKICAgIGludCAweDgwCgpwcmludF9lcnJvcl9jb2RlOgogICAgOyDQn9C10YfQsNGC0LDQtdGCINC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0LLQuNC00LUg0YHRgtGA0L7QutC4CiAgICA7INCe0LbQuNC00LDQtdGC0YHRjywg0YfRgtC+IGVheCDRgdC+0LTQtdGA0LbQuNGCINC60L7QtCDQvtGI0LjQsdC60LgKICAgIGFkZCBlYXgsICcwJyAgICAgICAgICAgICAgICAgICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INC60L7QtCDQvtGI0LjQsdC60Lgg0LIg0YHQuNC80LLQvtC7CiAgICBtb3YgW2Vycm9yX2NvZGVdLCBhbCAgICAgICAgICAgIDsg0JfQsNC/0LjRgdGL0LLQsNC10Lwg0YHQuNC80LLQvtC7INCyINCx0YPRhNC10YAKICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIGxlYSBlY3gsIFtlcnJvcl9jb2RlXSAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQsdGD0YTQtdGAINGBINC60L7QtNC+0Lwg0L7RiNC40LHQutC4CiAgICBtb3YgZWR4LCAxICAgICAgICAgICAgICAgICAgICAgIDsg0KDQsNC30LzQtdGAINCy0YvQstC+0LTQuNC80L7Qs9C+INGB0LjQvNCy0L7Qu9CwCiAgICBpbnQgMHg4MAogICAgcmV0Cg==