   #Start Contents

                        Uruchamianie innych programow

   Czasem zdarza sie, ze z poziomu naszego wlasnego programu musimy
   uruchomic jakis inny program lub polecenie systemowe. Sluzy do tego
   funkcja systemowa AH=4B przerwania DOS-a 21h. Jej argumenty to
   kolejno:
     * w AL - typ uruchomienia. Najczesciej AL=0, czyli zaladuj i uruchom
     * w ES:BX - adres struktury dotyczacej srodowiska uruchamianego
       programu. Pola struktury to kolejno:
          + (WORD) segment zawierajacy zmienne srodowiska. Mozna wpisac 0
            (wtedy bedzie skopiowany nasz segment srodowiska).
          + (DWORD) adres linii polecen uruchamianego programu
          + (DWORD) adres pierwszego File Control Block (FCB)
            uruchamianego programu (nieuzywane)
          + (DWORD) adres drugiego FCB uruchamianego programu
            (nieuzywane)
     * w DS:DX - adres nazwy uruchamianego programu

   Po wiecej szczegolow odsylam do listy przerwan Ralfa Brown'a (RBIL)

   Sprobujmy teraz napisac jakis prosty przyklad - uruchomienie samego
   NASMa (powinien sie wyswietlic blad, ze nie podano plikow
   wejsciowych). Program jest w skladni NASM.
   (przeskocz przykladowy program)
; Program uruchamiajacy inny program.
;
; Autor: Bogdan D.
; kontakt: bogdandr (at) op (dot) pl
;
; nasm -O999 -o exec_dos.com -f bin exec_dos.asm

section .text
org     100h

start:
        mov     ax, cs
        mov     es, ax          ; bedziemy zmieniac rozmiar segmentu kodu
        mov     bx, koniec      ; BX = rozmiar segmentu kodu
        shr     bx, 4           ; BX /= 16 - rozmiar w paragrafach
        inc     bx              ; zeby nie obciac naszego programu
        mov     ah, 4ah         ; funkcja zmiany rozmiaru
        int     21h
                                ; zwolnienie miejsca na ladowany program

        mov     [kom_ln+2], cs  ; uzupelniamy pola potrzebnych struktur
        mov     [fcb1+2], cs
        mov     [fcb2+2], cs

        mov     [sssp], sp      ; zachowujemy nasz stos
        mov     [sssp+2], ss

        mov     ax, 4b00h       ; funkcja uruchomienia programu
        mov     dx, program     ; adres nazwy programu
        mov     bx, srod        ; adres struktury srodowiska
        int     21h             ; uruchamiamy

        cli                     ; przywracamy nasz stos
        mov     sp, [sssp]
        mov     ss, [sssp+2]
        sti


        mov     ax, 4c00h
        int     21h

sssp            dd      0       ; miejsce na SS i SP

; linia polecen uruchamianego programu
linia_kom       db      0, "   ", 0dh

; File Control Block - juz nieuzywana przez DOS
; struktura, tu ustawiona na jakies bezpieczne domyslne wartosci
; (zgodnie z ksiazka Art of Assembler)
fcb             db      3," ",0,0,0,0,0

; nazwa programu do uruchomienia
program         db      "nasm.exe", 0

; struktura srodowiska
srod            dw      0               ; segment srodowiska. Nasz wlasny
                                        ; jest pod DS:[2ch]
kom_ln          dw      linia_kom, 0    ; offset i segment linii polecen
fcb1            dw      fcb, 0          ; offset i segment pierwszego FCB
fcb2            dw      fcb, 0          ; offset i segment drugiego FCB

koniec:

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