将数组传递给过程,使用Base+Offset访问元素



我正试图在一个过程中迭代一个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引用的内存位置。

相关内容

  • 没有找到相关文章

最新更新