Q. Example on PUBLIC DIVISOR?
Linker appends all segments having the same name and PUBLIC directive with segment name into one segment. Their contents are pulled together in consecutive memory locations.
The subsequent statement to be noted is PUBLIC DIVISOR. It tells the assembler and linker that this variable can be legally accessed by other assembly modules. Whereas EXTRN SMART_DIV: FAR conveys the assembler that this module will access a label or a procedure of type FAR in some assembly module. Please also note that EXTRN definition is enclosed within the PROCEDURES ENDS andPROCEDURES SEGMENT PUBLIC to tell the assembler and linker that procedure SMART_DIV is located within the segment PROCEDURES and all such PROCEDURES segments are required to be combined in one. Let's now define the PROCEDURE module:
; PROGRAM MODULE PROCEDURES
; INPUT : Dividend - low word in AX, high word in DX, Divisor in CX
; OUTPUT : Quotient - low word in AX, high word in DX. Remainder in CX
; Carry - carry flag is set if try to divide by zero
; DESTROYS: AX, BX, CX, DX, BP, FLAGS
DATA_SEG SEGMENT PUBLIC; this block tells the assembler that
EXTRN DIVISOR: WORD ; the divisor is a word variable and is
DATA_SEG ENDS ; external to this procedure. It would be
; found in segment named DATA_SEG
PUBLIC SMART_DIV ; SMART_DIV is available to
; Other modules. It is now being defined
; In PROCEDURES SEGMENT.
PROCEDURES SEGMENT PUBLIC
SMART_DIV PROC FAR
ASSUME CS: PROCEDURES, DS: DATA_SEG
CMP DIVISOR, 0; this is just to demonstrate the use of
; External variable, otherwise we can
; Check it through CX register which
; contains the divisor.
JE ERROR_EXIT ; IF divisor = 0, exit procedure
MOV BX, AX ; Save low order of dividend
MOV AX, DX; Position high word for 1st divide
MOV DX, 0000h; Zero DX
DIV CX; DX: AX/CX, quotient in AX,
; Remainder in DX
MOV BP, AX ; transfer high order of final result to BP
MOV AX, BX ; Get back low order of dividend. Note
; DX contains remainder so DX: AX is
; The actual number
DIV CX; DX: AX/CX, quotient in AX,
; 2nd remainder that is final remainder
; in DX
MOV CX, DX ; Pass final remainder in CX
MOV DX, BP ; Pass high order of quotient in DX
; AX contains lower word of quotient
CLC ; Clear carry to indicate valid result
JMP EXIT ; Finished
ERROR_EXIT: STC ; Set carry to indicate divide by zero
EXIT: RET
SMART_DIV ENDP
PROCEDURES ENDS
END
Discussion:
Procedure accesses the data item named DIVISOR that is defined in the main consequently the statement EXTRN DIVISOR: WORD is essential for informing assembler that this data name is found in some other segment. Data-type is defined to be of word type. Please consider that DIVISOR is enclosed in same segment name as that of main which is DATA_SEG and procedure is in a PUBLIC segment.