DWORD Local Variables Use Wrong Offset in MASM

ID Number: Q68945

5.10 | 5.10

MS-DOS | OS/2

buglist5.10 fixlist5.10a

Summary:

When using the LOCAL directive in the Microsoft Macro Assembler (MASM)

version 5.10 to declare stack space for a DWORD variable, the offset

that is generated for the variable is [BP-2]. This may result in the

saved value of the BP register to be overwritten when a value is

stored in the DWORD local variable.

Microsoft has confirmed this to be a problem in MASM version 5.10.

This problem was corrected in version 5.10a.

More Information:

Beginning with MASM 5.10, if the optional language parameter is used

with the .MODEL directive, the LOCAL directive may be used to declare

local variables for a procedure (PROC). When the LOCAL directive is

used in a procedure, stack space is set aside for the number and size

of the local variables that were declared. For example, upon

executing the first line of the sample assembly routine below, the

stack frame appears as follows if assembled with MASM 5.10:

----------

| Return | 2 bytes

| address|

----------

| Saved | 2 bytes

| BP |

----------

| storage| 2 bytes

SP--> | for foo|

----------

The problem is that DWORD needs four bytes of storage. Because the

"saved BP" is at a higher memory location than the storage of foo, foo

will "overflow" into the saved BP area. Using MASM 5.10a will solve

the problem by properly allocating 4 bytes of storage for a DWORD.

Sample Code

-----------

.MODEL SMALL, C

PUBLIC C myproc

.CODE

myproc PROC

LOCAL foo:DWORD

nop

ret

myproc ENDP

END