Assembly 为什么这个数组声明会入侵下一个? 我正在用微软Visual C++快车版学习使用MASM的IA32汇编程序,这一困难出现了。当我这样做时: 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 此程序运行不正确,因为文件名字符串在进程中间被擦除。Irvine 32.inc库可在Kip Irvine的网站上找到。我之所以使用它,是因为我的教授正在使用的教科书是Kip Irvine的第五版“英特尔计算机汇编语言”。当我为此更改变量声明时: fileName BYTE "vetor.txt", 0 fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0) fileHandler DWORD 0

Assembly 为什么这个数组声明会入侵下一个? 我正在用微软Visual C++快车版学习使用MASM的IA32汇编程序,这一困难出现了。当我这样做时: 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 此程序运行不正确,因为文件名字符串在进程中间被擦除。Irvine 32.inc库可在Kip Irvine的网站上找到。我之所以使用它,是因为我的教授正在使用的教科书是Kip Irvine的第五版“英特尔计算机汇编语言”。当我为此更改变量声明时: fileName BYTE "vetor.txt", 0 fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0) fileHandler DWORD 0,assembly,masm,irvine32,Assembly,Masm,Irvine32,程序运行正常 既然fileName变量应该在fibonacciVetor结束后立即分配,并且在写入数组时不应该受到影响,为什么仅仅更改声明的顺序就可以影响程序的运行方式 多谢各位 …因为fileName变量应该是 在本次会议结束后立即分配 fibonacciVetor和不应 写入数组时受影响 嗯,“不应该”!=“是”。使用调试器逐步查看范围错误的位置。我怀疑这一部分: L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor] add e

程序运行正常

既然fileName变量应该在fibonacciVetor结束后立即分配,并且在写入数组时不应该受到影响,为什么仅仅更改声明的顺序就可以影响程序的运行方式

多谢各位

…因为fileName变量应该是 在本次会议结束后立即分配 fibonacciVetor和不应 写入数组时受影响


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

我怀疑这一部分:

L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor]
    add eax, fibonacciVetor[esi * TYPE fibonacciVetor + 4]
    mov fibonacciVetor[esi * TYPE fibonacciVetor + 8], eax
我想最后一行可能会让你的文件名大吃一惊


遵循Per Larsen的建议,或者使用调试器逐步完成,或者添加一些打印语句。希望这能给你一个从哪里开始寻找的想法。

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


把-2去掉就行了。内存既便宜又丰富。毕竟,您没有在编写KIM-1。

我不是在问,因为我只是想让程序运行。我在请求你,我想学点东西。当然,制作一个1000个位置的数组并使用30个位置就可以了,但是我没有从中了解到为什么会出现这个问题,这就是我回答你的原因。你在一个45磅重的袋子里放了47磅。没必要嘲笑我,投我一票。