KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q28963: BC Makes Smaller EXE than Make EXE File Using .LIB; e.g. Mouse

Article: Q28963
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | B_BasicCom | mspl13_basic
Last Modified: 8-MAR-1989

Object (.OBJ) files linked to .LIB libraries from the DOS command line
may produce a smaller .EXE file than will be created with the Make EXE
File... option if you invoked QB.EXE Version 4.00 or 4.00b with the /L
option to use a Quick library (.QLB) file.

If the BC compiler options are the same for the two methods of making
the .EXE file, then the .EXE size difference depends on the syntax of
the LINK statement used to create the executable program, as follows:

1. If the .LIB file is specified in the .OBJ list (the first argument)
   for LINK.EXE, then ALL routines in the .LIB file are linked into the
   .EXE.

   When you invoke QB.EXE Version 4.00 or 4.00b with the /L option
   to load a Quick library, the Make EXE File... option automatically
   puts the .LIB (that matches the Quick library) in the .OBJ list,
   often making a larger .EXE.

2. If the .LIB file is specified in the .LIB list (the fourth
   parameter) for LINK.EXE, then just the external routines called from
   programs in the .OBJ list are pulled into the .EXE file from the .LIB
   file.

   QB.EXE Version 4.50 has been enhanced to do this automatically
   when you invoke with /L to load a Quick library and you choose
   the Make EXE File... option. This can make a smaller .EXE file if
   there are uncalled routines in the .LIB file.

This information about LINK.EXE applies to QuickBASIC Versions 4.00,
4.00b, and 4.50 and the BASIC Compiler Versions 6.00 and 6.00b for MS-DOS
and OS/2.

The example program below, MOUS.BAS, uses the statement CALL INT86old
to access the Microsoft Mouse through interrupt 51 (33 hex). INT86old
is an external routine contained in QB.LIB. Programs that use CALL
INT86old must be linked with the file QB.LIB (or run inside the
QuickBASIC editor with QB /L QB.QLB).

When the program MOUS.BAS is loaded into the QuickBASIC Version 4.00
or 4.00b editor and the Make EXE File... option is selected from the
RUN menu, the following LINK command is issued:

   LINK /EX /NOE MOUS+QB.LIB, C:MOUS.EXE, NUL,;

Pressing the F4 key in the QB.EXE editor lets you toggle to view this
command line because the editor covers the output screen by default
after Make EXE.

The resulting executable file (MOUS.EXE) has a size of 4213 bytes.
However, if the same program is compiled from the DOS command line and
then linked with the following command, the resulting executable file
has a size of only 3925 bytes:

   BC MOUS;
   LINK /EX /NOE MOUS, C:MOUS.EXE, NUL, QB.LIB,;

The size difference occurs because when the .LIB library files are
specified as the fourth parameter in the LINK statement (as in the
second LINK command above) the linker can be more "granular" than when
the .LIB library files are included in the first parameter.
Granularity refers to the ability of LINK.EXE to link in only those
modules within the library file(s) that are actually referenced by the
program. For example, if the library is composed of two object files,
SUB1.OBJ and SUB2.OBJ, but only one of them is ever CALLed by the
BASIC program, then only the one called will be linked into the EXE
file.

The following is the reason that Make EXE File... option in QB.EXE
Version 4.00 and 4.00b puts the .LIB file (which correspond to a
loaded Quick library) in the first parameter of the LINK syntax: the
resulting EXE will more closely resemble the program as it executes
inside the QuickBASIC editor.

By popular request, the Make EXE File... option was changed in QB.EXE
Version 4.50 to put the .LIB file in the library area for better
granularity (i.e., smaller .EXE files).

The following program CALLs the INT86old routine for drawing in
high-resolution graphics mode with the mouse:

   DECLARE SUB MOUS (m0%, m1%, m2%, m3%)
   DEFINT A-Z
   SCREEN 2
   m0 = 0: m1 = 0: m2 = 0: m3 = 0: oldx = 0: oldy = 0
   CALL MOUS(m0, m1, m2, m3)
      'initialize mouse
   m0 = 1
   INPUT "press any key to turn on mouse cursor:", x
   CALL MOUS(m0, m1, m2, m3)
   'turn on mouse cursor
   END
   SUB MOUS (m0, m1, m2, m3) STATIC
   DIM regs(7)
           regs(0) = m0: regs(1) = m1: regs(2) = m2: regs(3) = m3
           CALL int86old(51, regs(), regs())
           m0 = regs(0): m1 = regs(1): m2 = regs(2): m3 = regs(3)
   END SUB

The interrupt 51 (i.e., 33 hex) for Microsoft Mouse Version 6.00 (and
later) is documented in the following book: "Advanced MS-DOS
Programming," Second Edition, by Ray Duncan (published by Microsoft
Press, 1988) on Pages 593-611. (The first edition published in 1986
did not document the mouse interrupt.)

More information regarding making mouse calls from BASIC can be found
in the "Mouse Programmer's Reference Guide," which can be ordered from
Microsoft Customer Service by calling (206) 882-8088.

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.