BOESCH@SU-SIERRA.ARPA (Brian Boesch) (03/07/85)
[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 -------
harald@orphan.UUCP (Harald Striepe) (03/15/85)
> > [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