Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site orphan.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!bellcore!decvax!decwrl!orphan!harald From: harald@orphan.UUCP (Harald Striepe) Newsgroups: net.micro Subject: Re: Use of IBM PC-DOS \"EXEC\" function call Message-ID: <68@orphan.UUCP> Date: Fri, 15-Mar-85 14:27:18 EST Article-I.D.: orphan.68 Posted: Fri Mar 15 14:27:18 1985 Date-Received: Sun, 17-Mar-85 01:51:46 EST References: <9044@brl-tgr.ARPA> Organization: DEC Western Region Operations, Santa Clara, CA Lines: 210 > > [PHOTO: Recording initiated Thu 7-Mar-85 11:58AM] > > Does anyone have any experience with the use of PCDOS functions > (INT 21H) I have been trying to figure out how to use the "Exec" > function 4Bh and have been having no success. > > Would someone who has used this function call please let me know what > the secret is. A copy of a simple program using the call would > help also. > > Brian > > > ------- The key is to release the memory not used by your calling program. MS-DOS appears to allocate all memory to the current application until it is properly notified. Below is an example program. I don't have the shar utility, so you'll have to manually chop of the unneeded header or footer. Note that this worked on a Rainbow, but should also function on any other PC with MS-DOS V2 or higher. --------------------------- cut here --------------------------------- PAGE 56,132 TITLE Exec Call Test- Call COMMAND.COM SHELL to do Directory (.EXE file) NAME EXEC1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; DOS EXEC-CALL EXAMPLE ; ; Loads COMMAND.COM, and executes a directory on default drive. ; ; ; ; Based on a shell example by Brian Markey. ; ; Note: This example does not do any error checking!!! ; ; ; ; Author: H. Striepe 8/84 ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; EQUATES MSDOS EQU 021h ;MS-DOS interrupt Print EQU 009h ; func: print string terminated with $ ModMem EQU 04ah ; modify allocated memory Exec EQU 04bh ; load and execute program TermProc EQU 04ch ; terminate process Stacklen EQU 128 ;Size of program stack ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code SEGMENT PARA 'codeseg' ASSUME CS:code,SS:stack,DS:data,ES:nothing Start: ; Program entry point MOV AX,SEG data ; load data seg pointer MOV DS,AX ; . MOV AH,Print ; Print "Before shell" MOV DX,OFFSET mess1 ; . INT MSDOS ; .. ; MS-DOS allocates all available memory to a program upon loading, ; we first have to deallocate all unused memory using function 4Ah. ; ES := point to PSB (default after load) ; BX := current program size in paragraphs ; Note: If on calling function 4Ah ES: is not equal to the PSB MS-DOS ; allocated on loading, an ARENA TRASHED error will result. ; ES: still points to PSB, calculate memory required for calling ; routine: MOV BX,OFFSET end+256 ; code space+PSP ADD BX,stacklen ; + stackspace ADD BX,OFFSET lastloc+15 ; + data space MOV CX,4 ; in SHR BX,CL ; paragraphs XOR AL,AL ; Deallocate unused memory MOV AH,Modmem ; . INT MSDOS ; .. ; In case of error, carry would be set. ; Error codes in AX: 7=> arena trashed ; 8=> not enough memory ; 9=> invalid block MOV SI,2CH ; Get environment address MOV AX,ES:[SI] ; from PSP+2CH MOV WORD PTR parmblk,AX ; . MOV DX,OFFSET filenam ; Set up exec call PUSH DS ; . POP ES ; .. MOV BX,OFFSET parmblk ; ... XOR AL,AL ; .... MOV AH,Exec ; ..... PUSH DS ; Save machine state PUSH ES ; . MOV CS:savess,SS ; .. MOV CS:savesp,SP ; ... INT MSDOS ; Shell to DOS ; In case of error, carry would be set. ; Error codes in AX: 1=> invalid function ; 2=> file not found ; 8=> not enough memory ; 10=> bad environment ; 11=> bad format MOV SP,CS:savesp ; Restore machine state MOV SS,CS:savess ; . POP ES ; .. POP DS ; ... MOV AH,Print ; Print "After shell" MOV DX,OFFSET mess2 ; . INT MSDOS ; .. MOV AH,TermProc ; Terminate process XOR AL,AL ; . no error... INT MSDOS ; .. savess DW ? ; Holders for SS:SP savesp DW ? ; . end: code ENDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; stack SEGMENT PARA STACK 'stackseg' DB Stacklen DUP (?) ; Stack TOS LABEL BYTE ; . stack ENDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; data SEGMENT PARA 'dataseg' mess1 DB 'Before shell',0DH,0AH,'$' ; Program messages mess2 DB 'After shell',0DH,0AH,'$' ; .. filenam DB '\command.com',0 ; Load filename parmblk DW 00 ; Parameter block DD comline ; . DD fcb_one ; .. DD fcb_two ; ... comline DB 07H,'/C dir ',0DH ; Command line ; The following are two full fcb's db 0ffh ;flag byte, extended fcb db 5 dup (0) ;reserved db (0) ;attribute fcb_one db 0 ;drive number db " " ;filename db " " ;extension dw 0 ;current block dw 0 ;record size dd 0 ;file size dw 0 ;date of last write dw 0 ;time of last write db 8 dup (0) ;reserved db 0 ;current record dd 0 ;relative record db 0ffh ;flag byte, extended fcb db 5 dup (0) ;reserved db (0) ;attribute fcb_two db 0 ;drive number db " " ;filename db " " ;extension dw 0 ;current block dw 0 ;record size dd 0 ;file size dw 0 ;date of last write dw 0 ;time of last write db 8 dup (0) ;reserved db 0 ;current record dd 0 ;relative record lastloc LABEL BYTE ; End of program data ENDS END start ------------------------------------------------------------------ -- Harald Striepe DEC Western Region TBU decwrl!orphan!harald decwrl!dec-rhea!dec-wer521!striepe WER521::STRIEPE