为什么这个数组声明会入侵下一个?

时间:2010-04-13 20:26:46

标签: assembly masm irvine32

我正在使用Microsoft Visual C ++ Express Edition学习使用MASM的IA-32汇编,并且出现了这个难题。当我这样做时:

INCLUDE Irvine32.inc

QUANT = 47

.data

    fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0)
    fileName BYTE "vetor.txt", 0
    fileHandler DWORD 0

.code
main PROC

    mov esi, 0
    mov ecx, QUANT

L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor]
    add eax, fibonacciVetor[esi * TYPE fibonacciVetor + 4]
    mov fibonacciVetor[esi * TYPE fibonacciVetor + 8], eax
    inc esi
    loop L1

    mov edx, OFFSET fileName
    call CreateOutputFile
    mov fileHandler, eax
    mov edx, OFFSET fibonacciVetor
    mov ecx, QUANT * TYPE fibonacciVetor
    call WriteToFile
    mov eax, fileHandler
    call CloseFile

    exit

main ENDP
END main

此程序无法正常运行,因为fileName字符串在进程中间被删除。 Irvine32.inc库可以在Kip Irvine的网站上找到。我正在使用它,因为我教授使用的教科书是“基于英特尔的计算机的汇编语言”,第5版由Kip Irvine编写。当我为此更改变量声明时:

    fileName BYTE "vetor.txt", 0
    fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0)
    fileHandler DWORD 0

程序正常运行。

为什么简单地改变声明的顺序会影响程序的运行方式,因为fileName变量应该在fibonacciVetor结束后立即分配,并且在写入数组时不应该受到影响?

非常感谢。

3 个答案:

答案 0 :(得分:0)

  

...因为fileName变量应该是   在结束后立即分配   fibonacciVetor并不应该   我写到数组时会受到影响

嗯,“不应该”!=“是”。使用调试器逐步执行它以查看范围错误的位置。

答案 1 :(得分:0)

我怀疑这一节在这里:

L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor]
    add eax, fibonacciVetor[esi * TYPE fibonacciVetor + 4]
    mov fibonacciVetor[esi * TYPE fibonacciVetor + 8], eax

我认为最后一行可能是你文件名的破坏。

遵循Per Larsen的建议,并使用调试器逐步完成或添加一些打印语句。希望这能让您了解从哪里开始寻找。

答案 2 :(得分:-1)

只是一个猜测,但我会说定义中的(Quant - 2)术语是问题。我可以看到说(Quant - 1)如果要使用零相对数组,但是使用-2,则会丢失空间来放置最后一个元素。

摆脱-2。记忆力便宜且充足。毕竟,你不是在编写KIM-1。