【问题标题】:variable changing value unexpectedly only when equal to zero in MASM32只有在 MASM32 中等于零时,变量才会意外更改值
【发布时间】:2013-06-29 02:05:14
【问题描述】:

我最近让数组在 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] 表达式,从而改变了输出)。如果是这样,我该如何解决这个问题?

任何帮助将不胜感激。

【问题讨论】:

  • push [bfmem] - add [ecx * 4 + bfmem], eax - pop [bfmem] 会保护这个值,如果这就是问题所在
  • 不要推送/弹出。你只是在掩盖问题。

标签: arrays variables assembly masm masm32


【解决方案1】:

问题是你的声明:

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 运行您的程序,然后使用 invoke StdOut... 显示消息 (_messg)。您会看到它覆盖了部分消息。

我猜你的意思是:

bfmem  dd 30000 dup(0)

这是30000字节初始化为0。

【讨论】:

  • 哇,我这个白痴行动。是的,我把申报的尺寸和价值弄混了。永远不会去那里看;非常感谢!
  • @ValekHalfHeart 没问题。有时很难只见树木不见森林,这就是为什么让别人看看它是件好事。:)
猜你喜欢
  • 2021-10-17
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多