最近、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]
、出力を変更する何らかの方法で式を単純化します)。もしそうなら、どうすればこれを修正できますか?
どんな助けでも大歓迎です。