PAGE ,132 ; TITLE SALEX - STANDARD ENTRY AND LINKAGE FOR EXE TYPE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;THIS MODULE ILLUSTRATES THE STANDARD ENTRY AND EXIT EXPECTED TO BE PERFORMED ;BY ALL APPLICATIONS USING THE .EXE INTERFACE TO DOS. ; THE MAIN BODY OF CODE IS TO BE IN ANOTHER MODULE, CALLED FROM HERE AS A NEAR ; SUBROUTINE. AS A NEAR ROUTINE, THAT MAIN BODY MUST BE CODED IN A SEGMENT ; CALLED 'CSEG' (TO MATCH THE SEG NAME OF THE CALLER IN THIS MODULE HERE), AND ; THAT MAIN CODE MUST BE DEFINED IN A NEAR PROCEDURE NAMED 'START' THAT IS ; DEFINED AS A PUBLIC SYMBOL, SO LINK CAN MATCH THAT ENTRY WITH THE CALL ; FROM THIS MODULE HERE. ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DSEG SEGMENT PARA PUBLIC 'DATA' ; THIS DUMMY SEGMENT MERELY ESTABLISHES THE NAME 'DSEG' AS BEING A SEGMENT NAME. ; THE MAIN BODY OF CODE SHOULD DEFINE ITS DATA AS ALSO BEING IN A SEGMENT NAMED ; 'DSEG' TO MAKE USE OF THE ADDRESSABILITY TO 'DSEG' SET UP BY THIS MODULE HERE. DSEG ENDS ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEG EXTRN START:NEAR ;THE APPLICATION MAIN BODY OF CODE EXTRN STAK:BYTE ;INCLUDE STACK DESCRIPTION FROM LIBRARY ;AT ENTRY: ; CS=SEG ID OF 'CSEG', SEGMENT CONTAINING ENTRY POINT ; IP=OFFSET INTO 'CSEG' OF THE ENTRY POINT, WHO IS IDENTIFIED ; ON THE END STATEMENT OF THIS MODULE, AS BEING 'ENTPT'. ; SS=SEG ID OF STACK SEGMENT, DEFINED IN MODULE PULLED IN FROM ; LIBRARY IN RESPONSE THE THE ABOVE EXTRN 'STAK'. ; SP=SIZE OF THE STACK SEGMENT DEFINED IN THAT MODULE. ; ES AND DS=SEG ID OF THE PROGRAM SEGMENT PREFIX, CALLED "PSP", WHICH ; CONTAINS AT ITS OFFSET ZERO AN INT 20H (RETURN TO DOS) INSTRUCTION. ENTPT PROC FAR PUBLIC ENTPT ;NOT REALLY NEEDED, ; BUT DOES CAUSE ENTRY IN LINK'S MAP LISTING ; SET UP THE STACK SO IT WILL CONTAIN THE DOUBLE WORD VECTOR ALLOWING FOR ; A PROPER RETURN TO DOS VIA THE INT 20H AT THE START OF THE PSP. PUSH DS ;PUT THE SEG ID OF THE PSP ONTO THE STACK XOR AX,AX ;PUT THE ZERO OFFSET ONTO THE STACK, WHERE ZERO IS PUSH AX ; THE OFFSET OF THE INT 20H WITHIN THE PSP MOV AX,DSEG ;SET UP ADDRESSABILITY FOR THE MOV DS,AX ; DATA SEGMENT ; THE EXTRA SEGMENT REG, ES, STILL POINTS TO THE PSP. THE MAIN BODY ; COULD STILL NEED ADDRESSABILITY TO THE PSP FOR SUCH INFO AS READING ; THE COMMAND LINE PARAMETERS AT OFFSET 80H IN THE PSP. CALL START ;INVOKE THE APPLICATION MAIN BODY, WITH AX=SEG ID OF 'DSEG'. ; FOR THE RETURN TO EXECUTE PROPERLY, THE STACK MUST BE RESTORED TO THE ; POINT WHERE ONLY THE RETURN DOUBLE WORD VECTOR IS STILL ON THE STACK. ; ANY OTHER VALUES THAT INNER SUBROUTINES MAY HAVE PUSHED ONTO THE STACK ; MUST HAVE BEEN POPPED OFF BEFORE RETURNING TO THIS POINT. RET ;FAR RETURN TO DOS ; THIS USES THE DOUBLE WORD VECTOR PUSHED ONTO THE STACK TO CHANGE THE CS ; TO POINT TO THE PSP, WHOSE SEG ID WAS ORIGINALLY RECEIVED IN DS. THIS ; RET ALSO SETS THE IP TO ZERO, AS DEFINED IN THE DOUBLE WORD VECTOR FROM ; THE STACK. AT OFFSET OF ZERO IN THE PSP IS THE INT 20H INSTRUCTION ; WHICH DOES THE ACTUAL RETURN TO DOS. ENTPT ENDP CSEG ENDS END ENTPT F ZERO IN THE PSP IS THE INT