section .data
error_no_arg db "Error: File not specified.", 10, 0
error_open db "Error: Could not open file.", 10, 0
error_read db "Error: Failed to read file.", 10, 0
newline db 10
section .bss
buffer resb 1024
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:
mov eax, 5 ; sys_open
lea ebx, [esp + 8] ; Загрузка адреса argv[1]
mov ecx, 0 ; O_RDONLY
int 0x80
cmp eax, 0 ; Проверить, успешно ли открыт файл
jl file_open_error ; Если ошибка, перейти к обработке
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
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
c2VjdGlvbiAuZGF0YQogICAgZXJyb3Jfbm9fYXJnIGRiICJFcnJvcjogRmlsZSBub3Qgc3BlY2lmaWVkLiIsIDEwLCAwCiAgICBlcnJvcl9vcGVuIGRiICJFcnJvcjogQ291bGQgbm90IG9wZW4gZmlsZS4iLCAxMCwgMAogICAgZXJyb3JfcmVhZCBkYiAiRXJyb3I6IEZhaWxlZCB0byByZWFkIGZpbGUuIiwgMTAsIDAKICAgIG5ld2xpbmUgZGIgMTAKCnNlY3Rpb24gLmJzcwogICAgYnVmZmVyIHJlc2IgMTAyNAoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyDQn9GA0L7QstC10YDQutCwINC90LDQu9C40YfQuNGPINCw0YDQs9GD0LzQtdC90YLQvtCyINC60L7QvNCw0L3QtNC90L7QuSDRgdGC0YDQvtC60LgKICAgIG1vdiBlYXgsIFtlc3AgKyA0XSAgICAgICAgICAgICAgOyBhcmdjCiAgICBjbXAgZWF4LCAyICAgICAgICAgICAgICAgICAgICAgIDsgYXJnYyDQtNC+0LvQttC90L4g0LHRi9GC0YwgPj0gMgogICAgamFlIG9wZW5fZmlsZSAgICAgICAgICAgICAgICAgICA7INCV0YHQu9C4INC00LAsINC/0LXRgNC10LnRgtC4INC6INC+0YLQutGA0YvRgtC40Y4g0YTQsNC50LvQsAoKICAgIDsg0JLRi9Cy0L7QtCDQvtGI0LjQsdC60Lg6INGE0LDQudC7INC90LUg0YPQutCw0LfQsNC9CiAgICBtb3YgZWF4LCA0ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3dyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgICAgICAgICAgICAgICAgIDsgc3Rkb3V0CiAgICBtb3YgZWN4LCBlcnJvcl9ub19hcmcgICAgICAgICAgIDsg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1CiAgICBtb3YgZWR4LCAyNiAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdC+0L7QsdGJ0LXQvdC40Y8KICAgIGludCAweDgwCiAgICBqbXAgZXhpdF9wcm9ncmFtCgpvcGVuX2ZpbGU6CiAgICBtb3YgZWF4LCA1ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX29wZW4KICAgIGxlYSBlYngsIFtlc3AgKyA4XSAgICAgICAgICAgICAgOyDQl9Cw0LPRgNGD0LfQutCwINCw0LTRgNC10YHQsCBhcmd2WzFdCiAgICBtb3YgZWN4LCAwICAgICAgICAgICAgICAgICAgICAgIDsgT19SRE9OTFkKICAgIGludCAweDgwCiAgICBjbXAgZWF4LCAwICAgICAgICAgICAgICAgICAgICAgIDsg0J/RgNC+0LLQtdGA0LjRgtGMLCDRg9GB0L/QtdGI0L3QviDQu9C4INC+0YLQutGA0YvRgiDRhNCw0LnQuwogICAgamwgZmlsZV9vcGVuX2Vycm9yICAgICAgICAgICAgICA7INCV0YHQu9C4INC+0YjQuNCx0LrQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7QsdGA0LDQsdC+0YLQutC1CiAgICBtb3YgZWJ4LCBlYXggICAgICAgICAgICAgICAgICAgIDsg0KHQvtGF0YDQsNC90Y/QtdC8INGE0LDQudC70L7QstGL0Lkg0LTQtdGB0LrRgNC40L/RgtC+0YAg0LIgZWJ4CgpyZWFkX2ZpbGU6CiAgICBtb3YgZWF4LCAzICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX3JlYWQKICAgIG1vdiBlY3gsIGJ1ZmZlciAgICAgICAgICAgICAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDQsdGD0YTQtdGACiAgICBtb3YgZWR4LCAxMDI0ICAgICAgICAgICAgICAgICAgIDsg0JrQvtC70LjRh9C10YHRgtCy0L4g0LHQsNC50YIg0LTQu9GPINGH0YLQtdC90LjRjwogICAgaW50IDB4ODAKICAgIGNtcCBlYXgsIDAgICAgICAgICAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDQutCwOiDQtNC+0YHRgtC40LPQvdGD0YIg0LrQvtC90LXRhiDRhNCw0LnQu9CwPwogICAgamxlIGZpbGVfcmVhZF9lcnJvciAgICAgICAgICAgICA7INCV0YHQu9C4INC+0YjQuNCx0LrQsCwg0L/QtdGA0LXQudGC0Lgg0Log0L7QsdGA0LDQsdC+0YLQutC1CgogICAgOyDQn9C+0LjRgdC6INCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKICAgIG1vdiBlc2ksIGJ1ZmZlciAgICAgICAgICAgICAgICAgOyBlc2kg0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0L3QsNGH0LDQu9C+INCx0YPRhNC10YDQsAogICAgeG9yIGVjeCwgZWN4ICAgICAgICAgICAgICAgICAgICA7INCh0YfQtdGC0YfQuNC6INGB0YLRgNC+0LoKCmZpbmRfc2Vjb25kX2xpbmU6CiAgICBtb3YgYWwsIGJ5dGUgW2VzaV0gICAgICAgICAgICAgIDsg0KfQuNGC0LDQtdC8INGB0LjQvNCy0L7QuyDQuNC3INCx0YPRhNC10YDQsAogICAgY21wIGFsLCAwICAgICAgICAgICAgICAgICAgICAgICA7INCV0YHQu9C4INC00L7RgdGC0LjQs9C90YPRgiDQutC+0L3QtdGGINC00LDQvdC90YvRhSwg0LLRi9GF0L7QtNC40LwKICAgIGplIGVuZF9vZl9idWZmZXIKICAgIGNtcCBhbCwgW25ld2xpbmVdICAgICAgICAgICAgICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0YHQuNC80LLQvtC7INC90L7QstC+0Lkg0YHRgtGA0L7QutC4CiAgICBqbmUgc2tpcF9jaGFyCgogICAgaW5jIGVjeCAgICAgICAgICAgICAgICAgICAgICAgICA7INCj0LLQtdC70LjRh9C40LLQsNC10Lwg0YHRh9C10YLRh9C40Log0YHRgtGA0L7QugogICAgY21wIGVjeCwgMiAgICAgICAgICAgICAgICAgICAgICA7INCU0L7RgdGC0LjQs9C70Lgg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQuD8KICAgIGplIHByaW50X3NlY29uZF9saW5lCgpza2lwX2NoYXI6CiAgICBpbmMgZXNpICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KHQu9C10LTRg9GO0YnQuNC5INGB0LjQvNCy0L7QuwogICAgam1wIGZpbmRfc2Vjb25kX2xpbmUKCnByaW50X3NlY29uZF9saW5lOgogICAgOyDQn9C10YfQsNGC0LDQtdC8INCy0YLQvtGA0YPRjiDRgdGC0YDQvtC60YMKICAgIG1vdiBlZHgsIDAgICAgICAgICAgICAgICAgICAgICAgOyDQodGH0LjRgtCw0LXQvCDQtNC70LjQvdGDINCy0YLQvtGA0L7QuSDRgdGC0YDQvtC60LgKZmluZF9saW5lX2VuZDoKICAgIG1vdiBhbCwgYnl0ZSBbZXNpICsgZWR4XQogICAgY21wIGFsLCAwICAgICAgICAgICAgICAgICAgICAgICA7INCa0L7QvdC10YYg0LTQsNC90L3Ri9GFPwogICAgamUgZG9fd3JpdGUKICAgIGNtcCBhbCwgW25ld2xpbmVdICAgICAgICAgICAgICAgOyDQmtC+0L3QtdGGINGB0YLRgNC+0LrQuD8KICAgIGplIGRvX3dyaXRlCiAgICBpbmMgZWR4ICAgICAgICAgICAgICAgICAgICAgICAgIDsg0KPQstC10LvQuNGH0LjQstCw0LXQvCDQtNC70LjQvdGDINGB0YLRgNC+0LrQuAogICAgam1wIGZpbmRfbGluZV9lbmQKCmRvX3dyaXRlOgogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbGVhIGVjeCwgW2VzaV0gICAgICAgICAgICAgICAgICA7INCj0LrQsNC30LDRgtC10LvRjCDQvdCwINC90LDRh9Cw0LvQviDQstGC0L7RgNC+0Lkg0YHRgtGA0L7QutC4CiAgICBpbnQgMHg4MAogICAgam1wIGNsb3NlX2ZpbGUKCmVuZF9vZl9idWZmZXI6CmNsb3NlX2ZpbGU6CiAgICBtb3YgZWF4LCA2ICAgICAgICAgICAgICAgICAgICAgIDsgc3lzX2Nsb3NlCiAgICBpbnQgMHg4MAogICAgam1wIGV4aXRfcHJvZ3JhbQoKZmlsZV9vcGVuX2Vycm9yOgogICAgOyDQktGL0LLQvtC0INC+0YjQuNCx0LrQuDog0L3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDRhNCw0LnQuwogICAgbW92IGVheCwgNCAgICAgICAgICAgICAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICAgICAgICAgICAgICA7IHN0ZG91dAogICAgbW92IGVjeCwgZXJyb3Jfb3BlbiAgICAgICAgICAgICA7INGB0L7QvtCx0YnQtdC90LjQtSDQvtCxINC+0YjQuNCx0LrQtQogICAgbW92IGVkeCwgMzAgICAgICAgICAgICAgICAgICAgICA7INC00LvQuNC90LAg0YHQvtC+0LHRidC10L3QuNGPCiAgICBpbnQgMHg4MAogICAgam1wIGV4aXRfcHJvZ3JhbQoKZmlsZV9yZWFkX2Vycm9yOgogICAgOyDQktGL0LLQvtC0INC+0YjQuNCx0LrQuDog0L3QtSDRg9C00LDQu9C+0YHRjCDQv9GA0L7Rh9C40YLQsNGC0Ywg0YTQsNC50LsKICAgIG1vdiBlYXgsIDQgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzdGRvdXQKICAgIG1vdiBlY3gsIGVycm9yX3JlYWQgICAgICAgICAgICAgOyDRgdC+0L7QsdGJ0LXQvdC40LUg0L7QsSDQvtGI0LjQsdC60LUKICAgIG1vdiBlZHgsIDI5ICAgICAgICAgICAgICAgICAgICAgOyDQtNC70LjQvdCwINGB0L7QvtCx0YnQtdC90LjRjwogICAgaW50IDB4ODAKCmV4aXRfcHJvZ3JhbToKICAgIG1vdiBlYXgsIDEgICAgICAgICAgICAgICAgICAgICAgOyBzeXNfZXhpdAogICAgeG9yIGVieCwgZWJ4ICAgICAgICAgICAgICAgICAgICA7INCa0L7QtCDQt9Cw0LLQtdGA0YjQtdC90LjRjzogMAogICAgaW50IDB4ODAK