Question

I recently got arrays working in masm32, but I'm running into a very confusing snag. I have a procedure (AddValue) that accepts one argument and adds that argument to an element in an array called bfmem. Which element to affect is determined by a variable called index. However, index appears to be changing its value where i would not expect it to.

If index is greater than 0, the program behaves normally. However, if index equals 0, its value will be changed to whatever value was passed to the procedure. This is utterly baffling to me, especially as this only happens when index is set to zero. I don't know much MASM so forgive me if this is a really simple problem.

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib

.data
bfmem dd 0 dup(30000)
index dd 0
_output db 10 dup(0)

.code

AddValue proc val                          ; adds val to bfmem[index]

     invoke dwtoa, index, addr _output
     invoke StdOut, addr _output           ;prints '0' (as expected)

     mov ecx, index                        ;mov index to register for arithmatic
     mov eax, val                          ;mov val to register for arithmatic
     add [ecx * 4 + bfmem], eax            ;multiply index by 4 for dword
                                           ;then add to array to get the element's                  
                                           ;memory address, and add value

     invoke dwtoa, index, addr _output
     invoke StdOut, addr _output           ;prints '72' (not as expected)

     ret

AddValue endp    


main:
     mov index, 0
     invoke AddValue, 72 


     invoke StdIn, addr _output, 1
     invoke ExitProcess, 0

end main

The only thing I can think of is that the assembler is doing some kind of arithmetic optimization (noticing ecx is zero and simplifying the [ecx * 4 + bfmem] expression in some way that changes the output). If so, how can I fix this?

Any help would be appreciated.

Was it helpful?

Solution

The problem is that your declaration:

bfmem dd 0 dup(30000)

Says to allocate 0 bytes initialized with the value 30000. So when index is 0, you are overwriting the value of index (the address of index and bfmem coincide). Larger indexes you don't see the problem because you're overwriting other memory, like your output buffer. If you want to test to see that this is what's happening, try this:

bfmem dd 0 dup(30000)
index dd 0
_messg dd "Here is an output message", 13, 10, 0

Run your program with an index value of 1, 2, 3 and then display the message (_messg) using invoke StdOut.... You'll see that it overwrites parts of the message.

I assume you meant:

bfmem  dd 30000 dup(0)

Which is 30000 bytes initialized to 0.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top