Почему это объявление массива вторгается в следующий?

Я изучаю ассемблер для IA-32 с MASM, используя 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

Эта программа не работает правильно, потому что строка fileName стирается в середине процесса. Библиотеку Irvine32.inc можно найти на сайте Кипа Ирвина. Я использую его, потому что учебник, который использует мой профессор, - "Язык ассемблера для компьютеров на базе Intel", 5-е издание, Кип Ирвин. Когда я изменяю объявление переменных для этого:

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

Программа работает правильно.

Почему простое изменение порядка объявления влияет на то, как работает программа, или нет, поскольку переменная fileName должна быть размещена сразу после окончания fibonacciVetor, и на нее не должны влиять записи в массив?

Большое спасибо.

3 ответа

Я бы заподозрил этот раздел здесь:

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

Я думаю, что последняя строка может быть тем, что перекрывает ваше имя файла.

Следуйте совету Пер Ларсена и либо выполните его с помощью отладчика, либо добавьте несколько заявлений для печати. Надеюсь, это даст вам представление о том, с чего начать.

... так как переменная fileName должна быть размещена сразу после окончания fibonacciVetor и не должна быть затронута при записи в массив

Ну, "не должен"!= "Есть". Пройдите через него с помощью отладчика, чтобы увидеть, где находится ваша ошибка диапазона.

Просто предположение, но я бы сказал, что термин (Quant - 2) в определении является проблемой. Я мог видеть высказывание (Quant - 1), если вы собираетесь использовать относительный массив с нулем, но с -2 вы теряете место для размещения вашего последнего элемента.

Просто избавься от -2. Память дешевая и обильная. Вы ведь не программируете KIM-1.

Другие вопросы по тегам