dos_compilers/Microsoft C v5/SRC/STARTUP/CHKSUM.ASM
2024-07-04 11:24:57 -07:00

148 lines
3.4 KiB
NASM

page ,132
title chksum - _nullcheck routine for C
;***
;chksum.asm - _nullcheck routine for C
;
; Copyright (c) 1985-1988, Microsoft Corporation. All rights reserved.
;
;Purpose:
; This routine is used to check for assignment through a null pointer.
; Memory at DGROUP:0 is checked for destructive assignments. This
; routine is not particularly effective in compact and large models.
; A stub may be provoded for this routine without affecting the
; behavior of a correctly written C program.
;
;*******************************************************************************
?DF= 1 ; this is special for c startup
include version.inc
.xlist
include cmacros.inc
.list
createSeg _TEXT, code, word, public, CODE, <>
createSeg NULL, null, para, public, BEGDATA,DGROUP
createSeg _DATA, data, word, public, DATA, DGROUP
createSeg HDR, nhdr, byte, public, MSG, DGROUP
createSeg MSG, nmsg, byte, public, MSG, DGROUP
createSeg PAD, npad, byte, common, MSG, DGROUP
createSeg EPAD, nepad, byte, common, MSG, DGROUP
defGrp DGROUP ; define DGROUP
codeOFFSET equ offset _TEXT:
dataOFFSET equ offset DGROUP:
sBegin null
assumes ds,data
BIAS= 55h
chkpt db 8 dup(0) ; for null pointer assignment
CHKSUM= 11h ; has to be correct or error
db 'MS Run-Time Library - Copyright (c) 1988, Microsoft Corp'
chkb db CHKSUM ; checksum byte
db 0 ; leaves al = 0
chkln= $ - chkpt ; length to checksum
sEnd null
sBegin nmsg
assumes ds,data
dw 1
db 'R6001',13,10,'- null pointer assignment',13,10,0
sEnd
sBegin npad
assumes ds,data
dw -1
; no padding for now;
; MAX padding would be
; db 20 dup(0)
sEnd
externP _NMSG_WRITE ; pascal calling
externP _FF_MSGBANNER ; pascal calling
sBegin code
assumes cs,code
assumes ds,data
page
;***
;_nullcheck - check-sum of start of DGROUP segment to detect null-ptr-assignmt.
;
;Purpose:
; _nullcheck cumulatively xor's all the bytes from ds:0 through 1 past end
; of copyright string, finally xor'ing an arbitrary non-zero constant.
; This is used to check if a null pointer has been written to.
;
; This version can be called as many times as the user wants.
; The function returns zero if the checksum is OK.
;
; Note that this checksum only detects (DS:0) null pointer assignments
; but not (0:0) null pointer assignments.
;
;Entry:
; Assumes DS points to the beginning of DGROUP.
;
;Exit:
; Returns : AX = 0 if no error; AX = 1 if error.
;
;Uses:
; BX,CX,DX,ES are destroyed.
;
;Exceptions:
; If _nullcheck check-sum fails, an error message is written
; to standard error, and the routine returns an error code (AX = 1).
;
;*******************************************************************************
cProc _nullcheck,<PUBLIC>,<>
cBegin nogen ; no arguments - so no frame
push si
xor si,si ; start at DS:0
mov cx,chkln
xor ah,ah
cld
chkloop: ; loop to 1 past end of copyrt. string
lodsb
xor ah,al ; accumulate xor total in AH
loop chkloop
xor ah,BIAS ; XOR out the initial BIAS
jz setzero
call _FF_MSGBANNER ; (1) "\r\n" to stderr
; (2) FORTRAN $DEBUG file/line
; if _Fline is set (not in C)
; (3) "run-time error" banner
mov ax,1 ; null pointer assignment message no.
push ax
call _NMSG_WRITE ; write message out
mov ax,1 ; indicate error occurred
; ax = 0 if the checksum is OK
setzero:
pop si
ret
cEnd nogen
sEnd code
end