   #Start Contents English version

                  Uruchamianie innych programow pod Linuksem

   Czasem zdarza sie, ze z poziomu naszego wlasnego programu musimy
   uruchomic jakis inny program lub polecenie systemowe. Sluzy do tego
   funkcja systemowa sys_execve (numer 11). Jej argumenty to kolejno:
     * w EBX - adres nazwy programu do uruchomienia (ze sciezka). Nazwa
       powinna byc zakonczona bajtem zerowym. Mozna uruchomic skrypt.
     * w ECX - adres listy adresow argumentow dla uruchamianego programu.
       Lista powinna konczyc sie DWORDem zerowym.
     * w EDX - adres listy adresow zmiennych srodowiskowych dla
       uruchamianego programu. Lista powinna konczyc sie DWORDem zerowym.

   Sprobujmy wiec napisac jakis prosty przyklad - wyswietlenie napisu za
   pomoca programu echo.
   (przeskocz program)
; Uruchamianie innych programow w asemblerze pod Linuksem
;
; Autor: Bogdan D., bogdandr (at) op.pl
;
; kompilacja:
;
; nasm -f elf -o exec_linux.o exec_linux.asm
; ld  -o exec_linux exec_linux.o


section .text
global  _start

_start:

        mov     eax, 11                 ; numer funkcji sys_execve
        mov     ebx, komenda            ; plik do uruchomienia
        mov     ecx, argumenty          ; adres tablicy argumentow
        mov     edx, srodowisko         ; adres tablicy srodowiska
        int     80h

        mov     eax, 4
        mov     ebx, 1
        mov     ecx, info
        mov     edx, info_dl
        int     80h                     ; wyswietlenie napisu

        mov     eax, 1
        xor     ebx, ebx
        int     80h                     ; wyjscie z programu


section .data

komenda         db      "/bin/echo", 0  ; program do uruchomienia
info            db      "Wykonalem program.", 10 ; napis do wyswietlenia
info_dl         equ     $ - info

argumenty       dd      komenda         ; argv[0] to nazwa programu
                dd      arg1            ; argv[1]
                dd      0               ; koniec argumentow

arg1            db      "Czesc!", 0     ; argument pierwszy

srodowisko      dd      home            ; jedna zmienna srodowiskowa
                dd      0               ; koniec zmiennych srodowiskowych

home            db      "HOME=/home/bogdan", 0 ; przykladowa zmienna
                                                ; srodowiskowa $HOME

   Jedna rzecz od razu powinna rzucic sie w oczy: napis "Wykonalem
   program" nie jest wyswietlany. Dzieje sie tak dlatego, ze jesli
   funkcja sys_execve wykonala sie bez bledow, to ... nie powroci do
   naszego programu (tak, jak jest to napisane na stronie podrecznika:
   man execve). Duza wada, ale mozna to latwo przeskoczyc, stosujac watki
   lub funkcje typu sys_fork lub sys_clone, w celu uruchomienia osobnego
   watku lub procesu, ktory potem wykona sys_execve.

   Spis tresci off-line (klawisz dostepu 1)
   Spis tresci on-line (klawisz dostepu 2)
   Ulatwienia dla niepelnosprawnych (klawisz dostepu 0)
