x86: доступ к нарушению записи при использовании оператора OFFSET для адреса массива - PullRequest
0 голосов
/ 02 ноября 2019

Я получаю исключение в 0x0044369D в Project2.exe: 0xC0000005: Место записи нарушения прав доступа 0x00000099. Из моих исследований до сих пор у меня сложилось впечатление, что это связано с нулевым указателем или доступом к памяти вне диапазона из строки mov [eax], ecx

Я использовал оператор смещения в mov eax, OFFSET arrayfib, и я подумалэто должно исправить это. Кажется, я не могу понять, что является причиной проблемы здесь.

.model flat, stdcall 
.stack 4096
INCLUDE Irvine32.inc
ExitProcess PROTO, dwExitCode: DWORD

.data
arrayfib DWORD 35 DUP (99h)


.code 
main PROC   
    mov eax, OFFSET arrayfib    ;address of fibonacci number array 
    mov bx, 30                  ;number of Fibonacci numbers to generate
    call fibSequence            ;call to Fibonacci sequence procedure 
    mov edx, OFFSET arrayfib    ;passes information to call DumpMem
    mov ecx, LENGTHOF arrayfib
    mov ebx, TYPE arrayfib 
    call DumpMem

    INVOKE ExitProcess, 0 
main ENDP
;----------------------------------------------------------------------------------
;fibSequence
;Calculates the fibonacci numbers to the n'th fibonacci number 
;Receives: eax = address of the Fibonacci number array
;bx = number of Fibonacci numbers to generate
;ecx = used for Fibonacci calculation (i-2)
;edx = used for Fibonacci calculation (i-1)
;returns: [eax+4i] = each value of fibonacci sequence in array, scaled for doubleword
;---------------------------------------------------------------------------------

fibSequence PROC                    
    mov ecx, 0                  ;initialize the registers with Fib(0) and Fib(1)
    mov edx, 1      
    mov [eax], edx              ;store first Fibonacci number in the array 
                                ;since a Fibonacci number has been generated, decrement the counter
                                ;test for completion, proceed
    mov eax, [eax+4]

fibLoop: 
    sub bx, 1
    jz quit                     ;if bx = 0, jump to exit
    add ecx, edx
    push ecx                    ;save fib# for next iteration before it is destroyed
    mov [eax], ecx              ;stores new fibonacci number in the next address of array 
    push edx                    ;save other fib# before it is destroyed
    mov ecx, edx
    mov edx, [eax]
    mov eax, [eax+4]            ;increments accounting for doubleword 
    pop edx
    pop ecx 
quit: 
    exit
fibSequence ENDP
END main

Также, если есть какие-либо другие предложения, я буду рад их услышать. Я новичок во всем этом и хочу узнать как можно больше.

...