2010-04-13 57 views
0

我正在使用Microsoft Visual C++ Express Edition学习使用MASM为IA-32进行Assembly,并且出现了这个困难。当我这样做时:为什么这个数组声明会入侵下一个?

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的网站上找到。我正在使用它,因为我的教授正在使用的教科书是“基于Intel的计算机的汇编语言”,第5版由Kip Irvine提供。当我为此更改变量声明时:

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

程序正常运行。

为什么简单地改变声明的顺序会影响程序的运行或没有影响,因为fileName变量应该在fibonacciVetor结束之后立即分配,并且当我写入阵列?

非常感谢。

回答

0

...因为文件名可变应该 权 fibonacciVetor结束后分配的,不应该是当我写到阵列

好影响 ,“不应该”! =“是”。使用调试器来查看范围错误。

0

我会在这里怀疑本节:

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

我认为最后一行可能是什么则会覆盖您的文件名。

请遵循Per Larsen的建议,或者使用调试器或者添加一些打印语句。希望这可以让你知道从哪里开始寻找。

-1

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

刚摆脱-2。内存很便宜且丰富。毕竟,你并没有编程一个KIM-1。

+0

我不是问,因为我希望程序运行简单。我在问我在寻找什么。当然,制作1000个职位并使用30个职位的阵列可以实现这一目标,但是却没有告诉我为什么问题首先发生。 – jpmelos 2010-04-14 16:41:08

+0

这就是我为什么回答你的原因。你把45磅重的包装放在47磅。没有必要陷入困境并使我失望。 – Ron 2010-04-15 12:32:05

相关问题