【问题标题】:Why is this array declaration invading the next?为什么这个数组声明会入侵下一个?
【发布时间】:2010-04-13 20:26:46
【问题描述】:

我正在学习带有 MASM 的 IA-32 汇编,使用 Microsoft Visual C++ Express Edition,但遇到了这个困难。当我这样做时:

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 结束后立即分配,并且在我写入数组时不应该受到影响?

非常感谢。

【问题讨论】:

    标签: assembly masm irvine32


    【解决方案1】:

    ...因为 fileName 变量应该是 在结束后立即分配 fibonacciVetor 并且不应该是 当我写入数组时受到影响

    嗯,“不应该”!=“是”。使用调试器单步执行它以查看您的范围错误在哪里。

    【讨论】:

      【解决方案2】:

      我会怀疑这里的这个部分:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我不是在问,因为我只是想让程序运行。我要求我正在寻找学习的东西。当然,制作一个包含 1000 个位置并使用 30 个位置的数组就可以了,但一开始就没有告诉我为什么会出现问题。
        • 这就是我回答你的原因。你把 47 磅装进一个 45 磅的袋子里。无需对我投反对票。
        猜你喜欢
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        相关资源
        最近更新 更多