donk@dshovax.UUCP (don kinzer x2192) (01/29/85)
A while back I posted an article relating a problem I had noticed with the DOS loader where some bytes of a program were being bashed before execution even began. This was observed under both DOS V2.10 and V3.0. I've discovered the cause of the problem and the solution. Background The load module that I was building was a .EXE file. For reasons that aren't germane to this discussion, a stack segment was not declared. Naturally, the linker complained about the lack of the stack segment but, being that we often did this without any problems (although usually only when eventually generating .COM files), we ignored said warning. The load module indicates that no stack segment was declared by the existence of two zero words in the formatted portion of the .EXE header, specifically at byte offsets 0x0e and 0x10, corresponding to the initial values of the stack segment (relative to beginning of the load image) and the stack pointer respectively. The Problem It seems that whenever the loader loads a .EXE file that has no stack declared it always, without regard to the size of the load image, writes a zero byte at offsets 0xfffe and 0xffff with respect to the start of the load image. This is only a problem when a) the load image is greater than 65534 bytes and b) your application cares what is at offset 0xfffe-f. The Solution If your load image (code + data) is greater than 65534 bytes, your application must, to be safe, declare a stack segment. This will cause one or both of the words at offsets 0x0e and 0x10 of the formatted portion of the .EXE header to be non-zero thus preventing the undesirable side effect. Don Kinzer ... ihnp4!hplabs!intelca!omovax!dshovax!donk