Microsoft KB Archive/49399

= Example Allocating Memory in MASM Released by Basic's SETMEM =

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 &quot;Memory not reallocated&quot; ELSE PRINT &quot;Memory was successfully reallocated&quot; 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 .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
 * MASM 5.10 but not in earlier versions:

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:

Successfully allocated memory

Memory was successfully reallocated

Additional query words: QuickBas BasicCom

Keywords: KB49399

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.