Почему это объявление массива вторгается в следующий?
Я изучаю ассемблер для 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.