section .data
msg1 db "Поток номер 1 запущен.", 10 ; строка для потока 1 + \n
len1 equ $ - msg1 ; длина строки msg1
msg2 db "Поток номер 2 запущен.", 10 ; строка для потока 2 + \n
len2 equ $ - msg2 ; длина строки msg2
msg3 db "Поток номер 3 запущен.", 10 ; строка для потока 3 + \n
len3 equ $ - msg3 ; длина строки msg3
waitmsg db "Основной поток ожидает завершения потоков...",10 ; сообщение ожидания
waitlen equ $ - waitmsg ; длина waitmsg
donemsg db "Все потоки завершены.", 10 ; финальное сообщение
donelen equ $ - donemsg ; длина donemsg
section .text
global _start
thread_func:
; ecx = адрес строки, edx = длина
mov eax, 4 ; системный вызов write
mov ebx, 1 ; вывод на stdout
int 0x80 ; вызов ядра
ret ; возврат из функции
_start:
mov eax, 4
mov ebx, 1
mov ecx, waitmsg ; вывод сообщения ожидания
mov edx, waitlen
int 0x80
mov ecx, msg1 ; запуск "потока 1"
mov edx, len1
call thread_func
mov ecx, msg2 ; запуск "потока 2"
mov edx, len2
call thread_func
mov ecx, msg3 ; запуск "потока 3"
mov edx, len3
call thread_func
mov eax, 4
mov ebx, 1
mov ecx, donemsg ; вывод завершения
mov edx, donelen
int 0x80
mov eax, 1 ; системный вызов exit
xor ebx, ebx ; код выхода 0
int 0x80
c2VjdGlvbiAuZGF0YQptc2cxICAgIGRiICLQn9C+0YLQvtC6INC90L7QvNC10YAgMSDQt9Cw0L/Rg9GJ0LXQvS4iLCAxMCAgICAgOyDRgdGC0YDQvtC60LAg0LTQu9GPINC/0L7RgtC+0LrQsCAxICsgXG4KbGVuMSAgICBlcXUgJCAtIG1zZzEgICAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdGC0YDQvtC60LggbXNnMQptc2cyICAgIGRiICLQn9C+0YLQvtC6INC90L7QvNC10YAgMiDQt9Cw0L/Rg9GJ0LXQvS4iLCAxMCAgICAgOyDRgdGC0YDQvtC60LAg0LTQu9GPINC/0L7RgtC+0LrQsCAyICsgXG4KbGVuMiAgICBlcXUgJCAtIG1zZzIgICAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdGC0YDQvtC60LggbXNnMgptc2czICAgIGRiICLQn9C+0YLQvtC6INC90L7QvNC10YAgMyDQt9Cw0L/Rg9GJ0LXQvS4iLCAxMCAgICAgOyDRgdGC0YDQvtC60LAg0LTQu9GPINC/0L7RgtC+0LrQsCAzICsgXG4KbGVuMyAgICBlcXUgJCAtIG1zZzMgICAgICAgICAgICAgICAgICAgICAgIDsg0LTQu9C40L3QsCDRgdGC0YDQvtC60LggbXNnMwp3YWl0bXNnIGRiICLQntGB0L3QvtCy0L3QvtC5INC/0L7RgtC+0Log0L7QttC40LTQsNC10YIg0LfQsNCy0LXRgNGI0LXQvdC40Y8g0L/QvtGC0L7QutC+0LIuLi4iLDEwICA7INGB0L7QvtCx0YnQtdC90LjQtSDQvtC20LjQtNCw0L3QuNGPCndhaXRsZW4gZXF1ICQgLSB3YWl0bXNnICAgICAgICAgICAgICAgICAgICA7INC00LvQuNC90LAgd2FpdG1zZwpkb25lbXNnIGRiICLQktGB0LUg0L/QvtGC0L7QutC4INC30LDQstC10YDRiNC10L3Riy4iLCAxMCAgICAgOyDRhNC40L3QsNC70YzQvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1CmRvbmVsZW4gZXF1ICQgLSBkb25lbXNnICAgICAgICAgICAgICAgICAgICA7INC00LvQuNC90LAgZG9uZW1zZwoKc2VjdGlvbiAudGV4dApnbG9iYWwgX3N0YXJ0Cgp0aHJlYWRfZnVuYzoKICAgIDsgZWN4ID0g0LDQtNGA0LXRgSDRgdGC0YDQvtC60LgsIGVkeCA9INC00LvQuNC90LAKICAgIG1vdiBlYXgsIDQgICAgICA7INGB0LjRgdGC0LXQvNC90YvQuSDQstGL0LfQvtCyIHdyaXRlCiAgICBtb3YgZWJ4LCAxICAgICAgOyDQstGL0LLQvtC0INC90LAgc3Rkb3V0CiAgICBpbnQgMHg4MCAgICAgICAgOyDQstGL0LfQvtCyINGP0LTRgNCwCiAgICByZXQgICAgICAgICAgICAgOyDQstC+0LfQstGA0LDRgiDQuNC3INGE0YPQvdC60YbQuNC4Cgpfc3RhcnQ6CiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCB3YWl0bXNnICA7INCy0YvQstC+0LQg0YHQvtC+0LHRidC10L3QuNGPINC+0LbQuNC00LDQvdC40Y8KICAgIG1vdiBlZHgsIHdhaXRsZW4KICAgIGludCAweDgwCgogICAgbW92IGVjeCwgbXNnMSAgICAgOyDQt9Cw0L/Rg9GB0LogItC/0L7RgtC+0LrQsCAxIgogICAgbW92IGVkeCwgbGVuMQogICAgY2FsbCB0aHJlYWRfZnVuYwoKICAgIG1vdiBlY3gsIG1zZzIgICAgIDsg0LfQsNC/0YPRgdC6ICLQv9C+0YLQvtC60LAgMiIKICAgIG1vdiBlZHgsIGxlbjIKICAgIGNhbGwgdGhyZWFkX2Z1bmMKCiAgICBtb3YgZWN4LCBtc2czICAgICA7INC30LDQv9GD0YHQuiAi0L/QvtGC0L7QutCwIDMiCiAgICBtb3YgZWR4LCBsZW4zCiAgICBjYWxsIHRocmVhZF9mdW5jCgogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgZG9uZW1zZyAgOyDQstGL0LLQvtC0INC30LDQstC10YDRiNC10L3QuNGPCiAgICBtb3YgZWR4LCBkb25lbGVuCiAgICBpbnQgMHg4MAoKICAgIG1vdiBlYXgsIDEgICAgICAgIDsg0YHQuNGB0YLQtdC80L3Ri9C5INCy0YvQt9C+0LIgZXhpdAogICAgeG9yIGVieCwgZWJ4ICAgICAgOyDQutC+0LQg0LLRi9GF0L7QtNCwIDAKICAgIGludCAweDgw