Article ID: 49399
Article Last Modified on 8/16/2005
APPLIES TO
- Microsoft QuickBasic 4.0
- Microsoft QuickBASIC 4.0b
- Microsoft QuickBasic 4.5 for MS-DOS
- Microsoft BASIC Compiler 6.0
- Microsoft BASIC Compiler 6.0b
- Microsoft BASIC Professional Development System 7.0
- Microsoft BASIC Professional Development System 7.1
This article was previously published under Q49399
SUMMARY
The two programs shown below demonstrate how a Basic program can use SETMEM to free memory for an assembly routine to get dynamic memory.
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.
MORE INFORMATION
For more information about interlanguage calling between Basic and MASM, search in the Microsoft Knowledge Base using the following word:
BAS2MASM
Code Example
The following Basic program is BMEMSET.BAS, which uses SETMEM to free a block of memory for an assembly routine that uses a DOS interrupt to get dynamic memory:
DECLARE SUB AMem(BYVAL AllocSize AS INTEGER) CLS ' Decrease the size of the far heap so AMem can use a DOS ' interrupt to get dynamic memory BeforeCall% = SETMEM(-2048) CALL AMem(1024%) ' Return the memory to the far heap; use a larger value so ' all space goes back into the heap. AfterCall% = SETMEM(3500) LOCATE 2, 1 IF AfterCall% <= BeforeCall% THEN PRINT "Memory not reallocated" ELSE PRINT "Memory was successfully reallocated" END IF END
The following program is AMEMSET.ASM, which allocates and deallocates a block of memory freed by Basic:
; The following handy .MODEL MEDIUM,Basic directive is found in ; MASM 5.10 but not in earlier versions: .MODEL MEDIUM, Basic .DATA Fail DB 'Failed to allocate memory$' Success DB 'Successfully allocated memory$' .CODE PUBLIC AMem AMem PROC push bp mov bp, sp ; set stack frame push cx push es mov ax, [bp+6] ; get number of bytes freed mov cl, 4 ; divide by 16 to get number of shr ax, cl ; paragraphs of memory mov bx, ax mov ah, 48h ; DOS interrupt to allocate block int 21h ; of memory mov es, ax mov ah, 9 jnc NoFail ; carry flag clear if successful mov dx, OFFSET Fail ; display failed message int 21h jmp Exit ; go back to Basic NoFail: mov dx, OFFSET Success ; display success message int 21h mov ah, 49h int 21h Exit: pop es pop cx pop bp ret 2 AMem ENDP END
To demonstrate these programs from an .EXE program, compile and link as follows:
BC BMEMSET.BAS; MASM AMEMSET.ASM; LINK BMEMSET AMEMSET;
BMEMSET.EXE produces the following output:
Additional query words: QuickBas BasicCom
Keywords: KB49399