我正试图在一个过程中迭代一个10元素的SDWORD数组。我相信数组具有所有期望的值,因为当我在main中显示它们时,它应该是这样的。当我将数组的地址传递给过程时,第一个元素有效,但后面的每个元素都是0。我已经尝试了我能想到的每一种变体,调试器显示了正确的值。我就是不明白问题出在哪里。
当我使用下面的方法在main中迭代数组时,它会正确显示。
mov ecx, 10
_displayTemp:
mov ebx, ecx
sub ebx, 10
mov eax, numArray[ebx * TYPE finalNumber]
call WriteInt
call CrLf
loop _displayTemp
如果我这样做,我会得到全部0:
push OFFSET numArray
call bobBilby
bobBilby PROC
push ebp
mov ebp, esp
mov esi, [ebp + 8]
mov eax, [esi + 4]
call WriteInt
call CrLf
mov eax, [esi + 8]
call WriteInt
call CrLf
mov eax, [esi + 12]
call WriteInt
call CrLf
ret 4
bobBilby ENDP
我已经用一个数组测试了相同的代码,我手动将数据输入到这个数组中,它就工作了。
如果重要的话,调用填充过程的代码是这样的。我使用上面的第一个代码来测试它,它似乎具有所有的值。
mov ecx, 10
_fillArray:
mov ebx, ecx
sub ebx, 10
<lots of push OFFSETs>
call ReadVal
mov eax, finalNumber
mov numArray[ebx * TYPE finalNumber], eax
loop _fillArray
我在这里失去了它,所以任何帮助都会很棒。非常感谢。
循环计数器在ecx
中从10开始。按照loop
的工作方式,它递减到零,然后停止。
在每次迭代中:
- 您正在捕获
ecx
循环计数器(正在倒计时( - 然后减去10
所以对于第一次迭代,你有10-10,这是可以的,但在第二次迭代中,你有9-10(这是-1(,第三次迭代,8-10!
您应该是单步执行的,并且能够在单步执行期间至少以两种方式实现这一点:(1(在第二次迭代中减去10之后,ebx为负,以及(2(要存储到数组中的mov
填充不在数组中的内存——数组之前的内存。
我认为你要么不是一步到位,要么没有在每次指令后进行验证。无论哪种方式,您都需要提高调试技能。
同时,这段代码的其他部分正在遍历数组,所以这可能就是它找不到相同值的原因。
作为另一种调试技术,如果你有一行复杂的代码,那么用多行更简单的代码代替,例如:
而不是:
mov numArray[ebx * TYPE finalNumber], eax
这样做可以观察到所有的中间值。
sll ebx, 2 # verify ebx is right
add ebx, offset numArray # verify the pointer value in ebx
mov [ebx], eax # should be able to see exactly where stored
对于最后一个mov
,您应该验证eax
中的值是否出现在ebx
引用的内存位置。