[net.micro] Use of IBM PC-DOS \"EXEC\" function call

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