Почему это объявление массива вторгается в следующий? - PullRequest
0 голосов
/ 14 апреля 2010

Я изучаю сборку для 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 ]

0 голосов
/ 14 апреля 2010

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

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

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

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

0 голосов
/ 14 апреля 2010

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

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

0 голосов
/ 14 апреля 2010

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

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

...