0

我正在使用 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

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

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

程序运行正常。

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

非常感谢。

4

3 回答 3

0

...since the fileName variable should be allocated right after the end of the fibonacciVetor and should not be affected when I write to the array

Well, "should not" != "is". Step through it with a debugger to see where your range error is.

于 2010-04-13T20:45:44.770 回答
0

我会在这里怀疑这一部分:

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

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

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

于 2010-04-13T20:56:14.040 回答
-1

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

只需摆脱-2。内存既便宜又丰富。毕竟,您不是在为 KIM-1 编程。

于 2010-04-13T20:56:36.243 回答