логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.



Меню невыпадающее
Программистам : Другое :

Системный вызов waitpid ядра linux из ассемблера gas!

Системный вызов waitpid ( его номер 7 ) ждет завершения процесса, ид которого указано в первом параметре, после этого работа программы продолжается, в системный вызов передается 3 параметра, первый - ид процесса, завершение которого мы будем ждать, второй - куда нам передать код завершения процесса, если он нам не нужен, то этот параметр равен 0, и третий опции, пока они нам не пригодятся, поэтому тоже передадим ноль. В дальнейшем я собираюсь использовать этот системный вызов совместно с вызовами подмены процесса из группы execv, ну а сейчас пусть будет немного переделанный пример из примера системного вызова fork, простой, но наглядный примерчик.


.data
msg1:
        # Сообщение дочернего процесса
        .ascii " Hello, world! i am child proc! "
len1 = . - msg1
msg2:
        # Приветствие родительского процесса
        .ascii " Hello, world! i am parent proc! I wait for terminate child proc! "
len2 = .-msg2
msg3:
        # Сообщение родительского процесса после завершения дочернего
        .ascii " Child proc was terminated! "
len3 = . - msg3
.text
.global _start
_start:
movl $len2,%edx
        # Выводим приветствие
movl $msg2,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80
movl $2,%eax
        # Разделяем потоки
int $0x80
testl %eax,%eax
jz _middle
pushl %eax
        # здесь я сохраняю аккумулятор в стек
# так как в нем ид дочернего потока, можно было и сразу переписать его в ebx
# но я сделал через стек, чтобы здесь можно было вставить код, не опасаясь потерять ид
# дочернего процесса
popl %ebx         # тут уже выталкиваю ид процесса в ebx - первый параметр вызова waitpid
xorl %edx,%edx         # зануляю остальные два параметра, делаю это логической операцией xorl
xorl %ecx,%ecx         # так как она и места и времени меньше занимает у процессора
movl $7,%eax         # номер вызова waitpid в аккумулятор
int $0x80         # вызов
movl $len3,%edx         # выводим сообщение о завершении дочернего процесса
movl $msg3,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80
_exit:
        # Выход
movl $0,%ebx
movl $1,%eax
int $0x80
_middle:
        # дочерний процесс
movl $len1,%edx         # Выводим сообщение дочернего процесса
movl $msg1,%ecx
movl $1,%ebx
movl $4,%eax
int $0x80

jmp _exit
        # Прыгаем на выход
# ВСЕ!

Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.

Компилируем так
as -s -o waitforproc.o waitforproc.s
ld -s -o waitforproc waitforproc.o


скачать архив с исходным кодом и исполняемым файлом этого примера
tar.gz
zip


С уважением Pauk_pv ©

Здесь со времнем появятся ссылки дружественных и понравившихся сайтов

Информер ТИЦ


Небольшая цена поисковая оптимизация сайта в поисковых машинах.|база стройматериалов

Сайт создан Pauk_pv // Pauk@paukpv.pp.ru

Rambler's Top100 Каталог@MAIL.RU - каталог ресурсов интернет

При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©