|
|
1.1 root 1: TITLE chksum - _nullcheck routine for C
2: ;***
3: ;chksum.asm - _nullcheck routine for C
4: ;
5: ; Copyright (c) 1985-1987, Microsoft Corporation. All rights reserved.
6: ;
7: ;Purpose:
8: ; This routine is used to check for assignment through a null pointer.
9: ; Memory at DGROUP:0 is checked for destructive assignments. This
10: ; routine is not particularly effective in compact and large models.
11: ; A stub may be provoded for this routine without affecting the
12: ; behavior of a correctly written C program.
13: ;
14: ;*******************************************************************************
15:
16: ?DF= 1 ; this is special for c startup
17: include version.inc
18: .xlist
19: include cmacros.inc
20: .list
21:
22: createSeg _TEXT, code, word, public, CODE, <>
23:
24: createSeg NULL, null, para, public, BEGDATA,DGROUP
25: createSeg _DATA, data, word, public, DATA, DGROUP
26:
27: createSeg HDR, nhdr, byte, public, MSG, DGROUP
28: createSeg MSG, nmsg, byte, public, MSG, DGROUP
29: createSeg PAD, npad, byte, common, MSG, DGROUP
30: createSeg EPAD, nepad, byte, common, MSG, DGROUP
31:
32: defGrp DGROUP ; define DGROUP
33:
34: codeOFFSET equ offset _TEXT:
35: dataOFFSET equ offset DGROUP:
36:
37:
38: sBegin null
39: assumes ds,data
40:
41: BIAS= 55h
42:
43: chkpt db 8 dup(0) ; for null pointer assignment
44: CHKSUM= 1Eh ; has to be correct or error
45: db 'MS Run-Time Library - Copyright (c) 1987, Microsoft Corp'
46: chkb db CHKSUM ; checksum byte
47: db 0 ; leaves al = 0
48: chkln= $ - chkpt ; length to checksum
49:
50: sEnd null
51:
52: sBegin nmsg
53: assumes ds,data
54: dw 1
55: db 'R6001',13,10,'- null pointer assignment',13,10,0
56: sEnd
57:
58: sBegin npad
59: assumes ds,data
60: dw -1
61: ; no padding for now;
62: ; MAX padding would be
63: ; db 20 dup(0)
64: sEnd
65:
66: externP _NMSG_WRITE ; pascal calling
67: externP _FF_MSGBANNER ; pascal calling
68:
69: sBegin code
70: assumes cs,code
71: assumes ds,data
72:
73:
74: page
75: ;***
76: ;_nullcheck - check-sum of start of DGROUP segment to detect null-ptr-assignmt.
77: ;
78: ;Purpose:
79: ; _nullcheck cumulatively xor's all the bytes from ds:0 through 1 past end
80: ; of copyright string, finally xor'ing an arbitrary non-zero constant.
81: ; This is used to check if a null pointer has been written to.
82: ;
83: ; This version can be called as many times as the user wants.
84: ; The function returns zero if the checksum is OK.
85: ;
86: ; Note that this checksum only detects (DS:0) null pointer assignments
87: ; but not (0:0) null pointer assignments.
88: ;
89: ;Entry:
90: ; Assumes DS points to the beginning of DGROUP.
91: ;
92: ;Exit:
93: ; Returns : AX = 0 if no error; AX = 1 if error.
94: ;
95: ;Uses:
96: ; BX,CX,DX,ES are destroyed.
97: ;
98: ;Exceptions:
99: ; If _nullcheck check-sum fails, an error message is written
100: ; to standard error, and the routine returns an error code (AX = 1).
101: ;
102: ;*******************************************************************************
103:
104: cProc _nullcheck,<PUBLIC>,<>
105: cBegin nogen ; no arguments - so no frame
106: push si
107:
108: xor si,si ; start at DS:0
109: mov cx,chkln
110: xor ah,ah
111: cld
112:
113: chkloop: ; loop to 1 past end of copyrt. string
114: lodsb
115: xor ah,al ; accumulate xor total in AH
116: loop chkloop
117:
118: xor ah,BIAS ; XOR out the initial BIAS
119: jz setzero
120:
121: call _FF_MSGBANNER ; (1) "\r\n" to stderr
122: ; (2) FORTRAN $DEBUG file/line
123: ; if _Fline is set (not in C)
124: ; (3) "run-time error" banner
125: mov ax,1 ; null pointer assignment message no.
126: push ax
127: call _NMSG_WRITE ; write message out
128: mov ax,1 ; indicate error occurred
129:
130: ; ax = 0 if the checksum is OK
131:
132: setzero:
133: pop si
134: ret
135:
136: cEnd nogen
137:
138:
139: sEnd code
140:
141: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.