Article: Q49401
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | B_BasicCom H_MASM S_QuickASM | mspl13_basic
Last Modified: 5-SEP-1990
The two programs shown below demonstrate how a Microsoft BASIC program
can pass an array of double-precision variables to assembly language.
This information about interlanguage calling applies to QuickBASIC
versions 4.00, 4.00b, and 4.50 for MS-DOS, to Microsoft BASIC Compiler
versions 6.00 and 6.00b for MS-DOS and MS OS/2, and to Microsoft BASIC
Professional Development System (PDS) versions 7.00 and 7.10 for
MS-DOS and MS OS/2.
For more information about passing other types of parameters between
BASIC and MASM, search in the Software/Data Library for the following
word:
BAS2MASM
Code Example
------------
The following BASIC program is BDBL.BAS, which passes an uninitialized
array of double precision numbers to an assembly routine that
initializes the array:
DECLARE SUB FillDbl(BYVAL ASeg AS INTEGER, BYVAL AOff AS INTEGER)
DIM DblArray(1 TO 5) AS DOUBLE
CALL FillDbl(VARSEG(DblArray(1)), VARPTR(DblArray(1)))
FOR i% = 1 TO 5
PRINT DblArray(i%)
NEXT
END
The following program is ADBL.ASM, which initializes an array of
double-precision numbers passed from BASIC:
; The following handy .MODEL MEDIUM,BASIC directive is found in MASM
; 5.10 but not in earlier versions:
.MODEL MEDIUM, BASIC
.DATA
Dbl1 DQ 123.45 ; initialize data table
Dbl2 DQ 456.78
Dbl3 DQ 98765.432
Dbl4 DQ 12345.678
Dbl5 DQ 777.888
.CODE
PUBLIC FillDbl
FillDbl PROC
push bp
mov bp, sp ; set stack frame
push es ; Preserve (push) es, di, si
push di
push si
mov es, [bp+8] ; segment of array
mov di, [bp+6] ; offset of array
mov si, OFFSET Dbl1 ; get offset of data table
mov cx, 40 ; length of data in table
rep movsb ; copy data table to array
pop si ; Restore (pop) si, di, es
pop di
pop es
pop bp
ret 4
FillDbl ENDP
END
To demonstrate these programs from an .EXE program, compile and link
as follows:
BC BDBL.BAS;
MASM ADBL.ASM;
LINK BDBL ATWODBL;
BDBL.EXE produces the following output:
123.45
456.78
98765.432
12345.678
777.888