2010-04-13 40 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