|
|
1.1 ! root 1: ! 2: ; dynlib3.asm ! 3: ; ! 4: ; Created 17 August 1987 by Kevin Ruddell, Microsoft Corp ! 5: ; ! 6: ; ! 7: ; Demonstrates the use of shared and non-shared data segments. ! 8: ; When each process attaches, the contents of "count" (in a shared segment) ! 9: ; is incremented and assigned to "id" (in a non-shared segment). ! 10: ; "count" is used to detect the first time the initialization routine ! 11: ; is invoked. ! 12: ; When a process makes a call to PRINTDATA, the current values of ! 13: ; "count" and "id" are displayed on the screen. They will be different for ! 14: ; all but the last process to attach to the dll. ! 15: ! 16: ! 17: TITLE dynlib3 ! 18: ! 19: .286p ! 20: ! 21: EXTRN DOSWRITE:FAR ! 22: ! 23: ;----------------------------------------------------------------------------- ! 24: ;A fresh copy of this segment is created for each process attaching to the dll. ! 25: ! 26: ETHEL SEGMENT WORD PUBLIC 'FAR_DATA' ! 27: id DW 00H ;unique to each attached process ! 28: ETHEL ENDS ! 29: ! 30: ;--------------------------------------- ! 31: ;This segment is shared by all processes attached to the dll. ! 32: ! 33: FRED SEGMENT WORD PUBLIC 'FAR_DATA' ! 34: First DB 'First time initialization.', 0aH, 0dH, 00H ! 35: NotFirst DB 'Not first time initialization.', 0aH, 0dH, 00H ! 36: msg_beg DB 'I am number ', 00H ! 37: ORG $+1 ;to line up on word boundaries ! 38: const_1 DB '.', 0aH, 0dH, 00H ! 39: msg_mid DB '. There are ', 00H ! 40: count DW 00H ;number of processes which have attached ! 41: msg_end DB ' processes attached.', 0dH, 00H ! 42: written DW 00H ;bytes written ! 43: c DW 00H ;temporary variable ! 44: FRED ENDS ! 45: ! 46: ;----------------------------------------------------------------------------- ! 47: ;----------------------------------------------------------------------------- ! 48: ASSUME CS: _TEXT, DS: FRED, ES: ETHEL ! 49: ;--------------------------------------- ! 50: _TEXT SEGMENT BYTE PUBLIC 'CODE' ! 51: ;--------------------------------------- ! 52: ; START ! 53: ; Initialization routine. ! 54: ; Called for each process when the process attaches to the dll. ! 55: ; ! 56: ; count is initialized to 0 in its definition, and so can be used as a first- ! 57: ; time switch. A First/NotFirst message is sent to the screen and count is ! 58: ; incremented to reflect the number of processes which have attached to ! 59: ; the dll. The freshly-incremented count is copied to the non-shared ! 60: ; location id and is unique among the attached processes. Actually, ! 61: ; accesses to count should be synchronized, but this is omitted for simplicity. ! 62: ; The unique id is sent to the screen. ! 63: ! 64: ! 65: START PROC FAR ! 66: ! 67: push di ;save registers ! 68: push si ! 69: push ds ! 70: push es ! 71: ! 72: mov ax,SEG FRED ;set up segment registers ! 73: mov ds,ax ;ds points to global segment ! 74: mov ax,SEG ETHEL ! 75: mov es,ax ;es points to non-shared segment ! 76: ! 77: mov ax,count ! 78: inc WORD PTR count ;bump shared count of attached processes ! 79: cmp ax,0 ;test for first time through ! 80: jne START_NOT ! 81: ! 82: push 1 ;write to standard output (screen) ! 83: push ds ! 84: push OFFSET First ;address of "First time initialization." ! 85: push 28 ;number of bytes to write ! 86: push ds ! 87: push OFFSET written ;address to hold # bytes written ! 88: call FAR PTR DOSWRITE ;synchronous write ! 89: jmp START_ID ! 90: ! 91: START_NOT: ! 92: push 1 ;write to standard output ! 93: push ds ! 94: push OFFSET NotFirst ;addr of "Not first time initialization." ! 95: push 32 ;number of bytes to write ! 96: push ds ! 97: push OFFSET written ;address to hold # bytes written ! 98: call FAR PTR DOSWRITE ;synchronous write ! 99: ! 100: START_ID: ! 101: mov ax,count ;non-shared id = shared count ! 102: mov es:id,ax ! 103: ! 104: push 1 ;write to standard output ! 105: push ds ! 106: push OFFSET msg_beg ;addr of "I am number " ! 107: push 12 ;number of bytes to write ! 108: push ds ! 109: push OFFSET written ;address to hold # bytes written ! 110: call FAR PTR DOSWRITE ;synchronous write ! 111: ! 112: mov al,BYTE PTR count ! 113: add al,'0' ;c = count + '0' ! 114: mov BYTE PTR c,al ! 115: ! 116: push 1 ;write to standard output ! 117: push ds ! 118: push OFFSET c ;@c ! 119: push 1 ;number of bytes to write ! 120: push ds ! 121: push OFFSET written ;address to hold # bytes written ! 122: call FAR PTR DOSWRITE ;synchronous write ! 123: ! 124: push 1 ;write to standard output ! 125: push ds ! 126: push OFFSET const_1 ;addr of ".<cr><lf>" ! 127: push 3 ;number of bytes to write ! 128: push ds ! 129: push OFFSET written ;address to hold # bytes written ! 130: call FAR PTR DOSWRITE ;synchronous write ! 131: ! 132: mov ax,1 ;indicates success ! 133: pop es ;restore registers ! 134: pop ds ! 135: pop si ! 136: pop di ! 137: ret ! 138: ! 139: START ENDP ! 140: ;--------------------------------------- ! 141: ; PRINTDATA ! 142: ; Called by the attached process to display on the screen the current values ! 143: ; of the shared "count" and the non-shared "id". ! 144: ! 145: ! 146: PUBLIC PRINTDATA ;entry point ! 147: PRINTDATA PROC FAR ! 148: ! 149: push di ;save registers ! 150: push si ! 151: push ds ! 152: push es ! 153: ! 154: mov ax,SEG FRED ;set up segment registers ! 155: mov ds,ax ;ds points to global segment ! 156: mov ax,SEG ETHEL ! 157: mov es,ax ;es points to non-shared segment ! 158: ! 159: push 1 ;write to standard output ! 160: push ds ! 161: push OFFSET msg_beg ;addr of "I am number " ! 162: push 12 ;number of bytes to write ! 163: push ds ! 164: push OFFSET written ;address to hold # bytes written ! 165: call FAR PTR DOSWRITE ;synchronous write ! 166: ! 167: mov al,BYTE PTR es:id ! 168: add al,'0' ;c = id + '0' ! 169: mov BYTE PTR c,al ! 170: ! 171: push 1 ;write to standard output ! 172: push ds ! 173: push OFFSET c ;@c ! 174: push 1 ;number of bytes to write ! 175: push ds ! 176: push OFFSET written ;address to hold # bytes written ! 177: call FAR PTR DOSWRITE ;synchronous write ! 178: ! 179: push 1 ;write to standard output ! 180: push ds ! 181: push OFFSET msg_mid ;addr of ". There are " ! 182: push 13 ;number of bytes to write ! 183: push ds ! 184: push OFFSET written ;address to hold # bytes written ! 185: call FAR PTR DOSWRITE ;synchronous write ! 186: ! 187: mov al,BYTE PTR count ! 188: add al,'0' ;c = count + '0' ! 189: mov BYTE PTR c,al ! 190: ! 191: push 1 ;write to standard output ! 192: push ds ! 193: push OFFSET c ;@c ! 194: push 1 ;number of bytes to write ! 195: push ds ! 196: push OFFSET written ;address to hold # bytes written ! 197: call FAR PTR DOSWRITE ;synchronous write ! 198: ! 199: push 1 ;write to standard output ! 200: push ds ! 201: push OFFSET msg_end ;addr of " processes attached.<cr>" ! 202: push 21 ;number of bytes to write ! 203: push ds ! 204: push OFFSET written ;address to hold # bytes written ! 205: call FAR PTR DOSWRITE ;synchronous write ! 206: ! 207: pop es ;restore registers ! 208: pop ds ! 209: pop si ! 210: pop di ! 211: ret ! 212: ! 213: PRINTDATA ENDP ! 214: ;--------------------------------------- ! 215: _TEXT ENDS ! 216: ;----------------------------------------------------------------------------- ! 217: END START ;defines auto-initialization entry point
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.