0

我最近让数组在 masm32 中工作,但我遇到了一个非常令人困惑的问题。我有一个过程 ( AddValue),它接受一个参数并将该参数添加到名为bfmem. 影响哪个元素由名为 的变量决定index。然而,index似乎正在改变它的价值,我不希望它。

如果index大于 0,则程序正常运行。但是,如果index等于 0,则其值将更改为传递给过程的任何值。这对我来说完全莫名其妙,特别是因为这只发生在index设置为零时。我不太了解 MASM,如果这是一个非常简单的问题,请原谅我。

.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

我唯一能想到的是汇编器正在做某种算术优化(注意到 ecx 为零并[ecx * 4 + bfmem]以某种方式简化表达式,从而改变了输出)。如果是这样,我该如何解决这个问题?

任何帮助,将不胜感激。

4

1 回答 1

3

问题是您的声明:

bfmem dd 0 dup(30000)

说分配 0 个字节,初始化值为 30000。所以当index为 0 时,您将覆盖index(地址indexbfmem重合)的值。较大的索引您看不到问题,因为您正在覆盖其他内存,例如输出缓冲区。如果你想测试看看这是怎么回事,试试这个:

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

index使用值 1、2、3运行您的程序,然后_messg使用invoke StdOut.... 您会看到它覆盖了部分消息。

我假设你的意思是:

bfmem  dd 30000 dup(0)

即 30000 字节初始化为 0。

于 2013-06-29T03:27:46.940 回答