我正在使用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结束后立即分配,并且在写入数组时不应该受到影响?
非常感谢。
答案 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。