0

最近、masm32 で配列が動作するようになりましたが、非常に紛らわしい障害に遭遇しています。AddValue引数を 1 つ受け取り、その引数を という配列の要素に追加する手続き ( ) があります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)

値30000で初期化された0バイトを割り当てると言います。したがって、indexが0の場合、index(のアドレスindexbfmem一致する)の値を上書きしています。出力バッファなどの他のメモリを上書きしているため、インデックスが大きくても問題は発生しません。これが起こっていることを確認するためにテストしたい場合は、これを試してください:

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

index1、2、3の値を指定してプログラムを実行し、_messgを使用してメッセージ ( ) を表示しますinvoke StdOut...。メッセージの一部が上書きされることがわかります。

私はあなたが意味したと仮定します:

bfmem  dd 30000 dup(0)

これは、0 に初期化された 30000 バイトです。

于 2013-06-29T03:27:46.940 に答える