Czasem zdarza się, że z poziomu naszego własnego programu musimy uruchomić jakiś inny program lub polecenie systemowe. Służy do tego funkcja systemowa AH=4B przerwania DOS-a 21h. Jej argumenty to kolejno:
Po więcej szczegółów odsyłam do listy przerwań Ralfa Brown'a (RBIL)
Spróbujmy teraz napisać jakiś prosty przykład - uruchomienie samego NASMa (powinien się wyświetlić błąd, że nie podano plików wejściowych). Program jest w składni NASM.
; Program uruchamiający 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 ; będziemy zmieniać rozmiar segmentu kodu mov bx, koniec ; BX = rozmiar segmentu kodu shr bx, 4 ; BX /= 16 - rozmiar w paragrafach inc bx ; żeby nie obciąć naszego programu mov ah, 4ah ; funkcja zmiany rozmiaru int 21h ; zwolnienie miejsca na ładowany program mov [kom_ln+2], cs ; uzupełniamy 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 środowiska 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 poleceń uruchamianego programu linia_kom db 0, " ", 0dh ; File Control Block - juz nieużywana przez DOS ; struktura, tu ustawiona na jakieś bezpieczne domyślne wartości ; (zgodnie z książką Art of Assembler) fcb db 3," ",0,0,0,0,0 ; nazwa programu do uruchomienia program db "nasm.exe", 0 ; struktura środowiska srod dw 0 ; segment środowiska. Nasz własny ; jest pod DS:[2ch] kom_ln dw linia_kom, 0 ; offset i segment linii poleceń fcb1 dw fcb, 0 ; offset i segment pierwszego FCB fcb2 dw fcb, 0 ; offset i segment drugiego FCB koniec: