


Addendum to 20 Sample Assembly Language Programs

5 ways to connect separate modules


A>TYPE B:MAIN-1.LST

  The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1

; MAIN-1CONNECTING SEGMENTS AND MODULES

;METHOD #1  -USING PUBLIC SEGMENT NAMES

 0000STACKSEGMENT STACK;"STACK" AS SEGMENT COMBINE TYPE IS MAGIC.
 0000  02 [????  ] DW 2 DUP(?)
 0004STACKENDS

EXTRN SUBR1:NEAR

 0000METH_1_CODESEGMENT  PUBLIC
ASSUME CS:METH_1_CODE,SS:STACK

 0000BEGIN_MAIN_1PROC FAR
 0000  1EPUSH DS ;SET UP FOR RETURN TO DOS
 0001  33 C0XOR AX,AX
 0003  50PUSH AX
 0004  E8 0000 ECALL SUBR1;SUBR1 IS IN THIS SEGMENT,IN ANOTHER MODULE.
 0007  CBRET;RETURN TO DOS
 0008BEGIN_MAIN_1ENDP
 0008METH_1_CODEENDS
END BEGIN_MAIN_1
A>TYPE B:SUB-1.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; SUB1    METHOD 1, MODULE 2

PUBLIC SUBR1

 0000METH_1_CODESEGMENT PUBLIC
ASSUME CS:METH_1_CODE
 0000SUBR1PROCNEAR
 0000  90NOP
 0001  C3RET
 0002SUBR1ENDP
 0002METH_1_CODEENDS
END

A>TYPE B:MAIN-1.MAP

 StartStop   Length  Name      Class
 00000H 00011H 0012H  METH_1_CODE
 00020H 00023H 0004H  STACK

  Address  Publics by Name

 0000:0010 SUBR1

Program entry point at 0000:0000


A>TYPE B:MAIN-2.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; MAIN-2CONNECTING SEGMENTS AND MODULES

;   METHOD #2  -USING FAR CALLS.

 0000STACKSEGMENT STACK;"STACK" AS SEGMENT COMBINE TYPE IS MAGIC.
 0000  02 [????  ] DW 2 DUP(?)
 0004STACKENDS

EXTRN SUBR2:FAR

 0000MAIN_2_CODESEGMENT  PUBLIC
ASSUME CS:MAIN_2_CODE,SS:STACK

 0000BEGIN_MAIN_2PROC FAR
 0000  1EPUSH DS ;SET UP FOR RETURN TO DOS
 0001  33 C0XOR AX,AX
 0003  50PUSH AX
;SUBR2 MAY BE IN THIS PHYSICAL SEGMENT,IN ANOTHER
 0004  9A 0000 ---- ECALL SUBR2; MODULE, BUT ASSEMBLER CANNOT KNOW WHAT THE
; ASSUME CS: IS IN OTHER MODULES AS IN METHOD 1.
 0009  CBRET;RETURN TO DOS
 000ABEGIN_MAIN_2ENDP
 000AMAIN_2_CODEENDS
END BEGIN_MAIN_2
A>TYPE B:SUB-2.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; SUB2METHOD 2, MODULE 2

PUBLIC SUBR2

 0000SUB2_DATASEGMENT PUBLIC
 0000  04D2SUB2_LOCAL_WORD DW 1234
 0002SUB2_DATAENDS

 0000SUB_2_CODESEGMENT PUBLIC
ASSUME CS:SUB_2_CODE, DS:SUB2_DATA
 0000SUBR2PROC   FAR;FAR - CS REFERENCES THIS SEGMENT AT
 0000  A1 0000 RMOV AX,SUB2_LOCAL_WORD; ASSEMBLY TIME,
 0003  EB 01 90 JMP NEXT_INSTR; SO A 2-WORD (SEG:OFFSET) CALL
 0006  90NEXT_INSTR:NOP; MUST BE GENERATED ELSEWHERE.
 0007  CBRET
 0008SUBR2ENDP
 0008SUB_2_CODEENDS
END

A>TYPE B:MAIN-2.MAP

 StartStop   Length  Name      Class
 00000H 00009H 000AH  MAIN_2_CODE
 00010H 00013H 0004H  STACK
 00020H 00021H 0002H  SUB2_DATA
 00030H 00037H 0008H  SUB_2_CODE

  Address  Publics by Name

 0003:0000 SUBR2

Program entry point at 0000:0000


A>TYPE B:MAIN-3.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; MAIN-3CONNECTING SEGMENTS AND MODULES

;   METHOD #3  -USING FAR CALLS AND CLASSNAMES. LIKE METHOD #2, EXCEPT SEGMENTS
;      WITH THE SAME CLASSNAME GET CONCATENATED ON PARAGRAPH BOUNDARIES AT LINK
;      TIME. MAKES DEBUGGING EASIER AND PROVIDES A METHOD OF PUTTING DATA IN ONE
;      AREA OF MEMORY, AND CODE IN ANOTHER, PERHAPS EVENTUALLY IN ROM.

 0000STACKSEGMENT STACK;"STACK" AS SEGMENT COMBINE TYPE IS MAGIC.
 0000  02 [????  ] DW 2 DUP(?)
 0004STACKENDS

EXTRN SUBR3:FAR
 0000MAIN_3_CODESEGMENT  PUBLIC 'Z_CODE'
ASSUME CS:MAIN_3_CODE,SS:STACK
 0000BEGIN_MAIN_3PROC FAR
 0000  1EPUSH DS ;SET UP FOR RETURN TO DOS
 0001  33 C0XOR AX,AX
 0003  50PUSH AX
;SUBR3 MAY BE IN THIS PHYSICAL SEGMENT,IN ANOTHER
 0004  9A 0000 ---- ECALL SUBR3; MODULE, BUT ASSEMBLER CANNOT KNOW WHAT THE
; ASSUME CS: IS IN OTHER MODULES AS IN METHOD 1.
 0009  CBRET;RETURN TO DOS
 000ABEGIN_MAIN_3ENDP
 000AMAIN_3_CODEENDS
END BEGIN_MAIN_3

A>TYPE B:SUB-3.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; SUB3METHOD 3, MODULE 2
;NOTE THE DIFFERENCE BETWEEN THE MAIN-2.MAP AND THE MAIN-3.MAP
PUBLIC SUBR3

 0000SUB3_DATASEGMENT PUBLIC 'Z_DATA'
 0000  04D2SUB3_LOCAL_WORD DW 1234
 0002SUB3_DATAENDS

 0000SUB_3_CODESEGMENT PUBLIC'Z_CODE'
ASSUME CS:SUB_3_CODE, DS:SUB3_DATA
 0000SUBR3PROC   FAR;FAR - CS REFERENCES THIS SEGMENT AT
 0000  A1 0000 RMOV AX,SUB3_LOCAL_WORD; ASSEMBLY TIME,
 0003  EB 01 90 JMP NEXT_INSTR; SO A 2-WORD (SEG:OFFSET) CALL
 0006  90NEXT_INSTR:NOP; MUST BE GENERATED ELSEWHERE.
 0007  CBRET
 0008SUBR3ENDP
 0008SUB_3_CODEENDS
END
A>TYPE B:MAIN-3.MAP

 StartStop   Length  Name      Class
 00000H 00009H 000AH  MAIN_3_CODE     Z_CODE
 00010H 00017H 0008H  SUB_3_CODE     Z_CODE
 00020H 00023H 0004H  STACK
 00030H 00031H 0002H  SUB3_DATA      Z_DATA

  Address  Publics by Name

 0001:0000 SUBR3

Program entry point at 0000:0000


A>TYPE B:MAIN-4.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; MAIN-4CONNECTING SEGMENTS AND MODULES

;   METHOD #4  -USING THE GROUP DIRECTIVE. LIKE METHOD #3, EXCEPT SEGMENTS IN
;     THE SAME GROUP GET CONCATENATED TO FORM ONE PHYSICAL SEGMENT AT LINK
;     TIME. ALLOWS THE SEGMENT REGISTERS TO REFERENCE A GROUP, WHICH IS 64K OR
;     SMALLER, MEANING 1-WORD CALLS AND OFFSETS ALL REFERENCE THE SAME PLACE.

 0000STACKSEGMENT STACK;"STACK" AS SEGMENT COMBINE TYPE IS MAGIC.
 0000  02 [????  ] DW 2 DUP(?)
 0004STACKENDS

ALL_CODEGROUP MAIN_4_CODE
 0000MAIN_4_CODESEGMENT  PUBLIC 'Z_CODE'
ASSUME CS:ALL_CODE,SS:STACK
EXTRN SUBR4:NEAR;PUT THE EXTRN INSIDE THE SEGMENT
 0000BEGIN_MAIN_4PROC FAR; SINCE I KNOW IT IS IN ALL_CODE.
 0000  1EPUSH DS ;SET UP FOR RETURN TO DOS
 0001  33 C0XOR AX,AX
 0003  50PUSH AX
;SUBR4 IS IN THIS PHYSICAL SEGMENT,IN ANOTHER
 0004  E8 0000 ECALL SUBR4; MODULE, ASSEMBLER USES OFFSET RELATIVE TO THE
; GROUP NAME, LINKER FIXES IT ALL UP.
 0007  CBRET;RETURN TO DOS
 0008BEGIN_MAIN_4ENDP
 0008MAIN_4_CODEENDS
END BEGIN_MAIN_4
A>TYPE B:SUB-4.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; SUB4METHOD 4, MODULE 2
;NOW WE CAN USE A NEAR PROCEDURE. THE DATA, OF COURSE, CAN BE IN A
;GROUP TOO. BUT IN THIS EXAMPLE THERE IS ONLY ONE DATA SEGMENT.

PUBLIC SUBR4
 0000SUB4_DATASEGMENT PUBLIC
 0000  04D2SUB4_LOCAL_WORD DW 1234
 0002SUB4_DATAENDS

ALL_CODEGROUP SUB_4_CODE

 0000SUB_4_CODESEGMENT PUBLIC'Z_CODE'
ASSUME CS:ALL_CODE, DS:SUB4_DATA
 0000SUBR4PROC   NEAR
 0000  A1 0000 RMOV AX,SUB4_LOCAL_WORD
 0003  EB 01 90 JMP NEXT_INSTR
 0006  90NEXT_INSTR:NOP
 0007  C3RET
 0008SUBR4ENDP
 0008SUB_4_CODEENDS
END
A>TYPE B:MAIN-4.MAP

 StartStop   Length  Name      Class
 00000H 00007H 0008H  MAIN_4_CODE     Z_CODE
 00010H 00017H 0008H  SUB_4_CODE     Z_CODE
 00020H 00023H 0004H  STACK
 00030H 00031H 0002H  SUB4_DATA


A>TYPE B:MAIN-5.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; MAIN-5CONNECTING SEGMENTS AND MODULES

;   METHOD #5  -USING NEAR CALLS AND CLASSNAMES. LIKE METHOD #3, EXCEPT SEGMENTS
;      WITH THE SAME CLASSNAME GET CONCATENATED ON PARAGRAPH BOUNDARIES AT LINK
;      TIME. IF THE SEGMENT CONTAINING THE EXTERNAL REFERENCE IS KNOWN, PUT THE
;      EXTRN IN THE SEGMENT.

 0000STACKSEGMENT STACK;"STACK" AS SEGMENT COMBINE TYPE IS MAGIC.
 0000  02 [????  ] DW 2 DUP(?)
 0004STACKENDS

 0000MAIN_5_CODESEGMENT  PUBLIC 'Z_CODE'
EXTRN SUBR5:NEAR
ASSUME CS:MAIN_5_CODE,SS:STACK

 0000BEGIN_MAIN_5PROC FAR
 0000  1EPUSH DS ;SET UP FOR RETURN TO DOS
 0001  33 C0XOR AX,AX
 0003  50PUSH AX
;SUBR5 MAY BE IN THIS PHYSICAL SEGMENT,IN ANOTHER
 0004  E8 0000 ECALL SUBR5; MODULE, ASSEMBLER TRUSTS WHERE THE EXTRN
; EXTRN STATEMENT IS.
 0007  CBRET;RETURN TO DOS
 0008BEGIN_MAIN_5ENDP
 0008MAIN_5_CODEENDS
END BEGIN_MAIN_5
A>TYPE B:SUB-5.LST

   The IBM Personal Computer MACRO Assembler 02-11-83PAGE1-1
; SUB5METHOD 5, MODULE 2
PUBLIC SUBR5

 0000SUB5_DATASEGMENT PUBLIC 'Z_DATA'
 0000  04D2SUB5_LOCAL_WORD DW 1234
 0002SUB5_DATAENDS

 0000SUB_5_CODESEGMENT PUBLIC'Z_CODE'
ASSUME CS:SUB_5_CODE, DS:SUB5_DATA
 0000SUBR5PROC   NEAR
 0000  A1 0000 RMOV AX,SUB5_LOCAL_WORD
 0003  EB 01 90 JMP NEXT_INSTR
 0006  90NEXT_INSTR:NOP
 0007  C3RET
 0008SUBR5ENDP
 0008SUB_5_CODEENDS
END
A>TYPE B:MAIN-5.MAP

 StartStop   Length  Name      Class
 00000H 00007H 0008H  MAIN_5_CODE     Z_CODE
 00010H 00017H 0008H  SUB_5_CODE     Z_CODE
 00020H 00023H 0004H  STACK
Class
 00000H 00007H 0008H  MA