2016-02-28 4 views
2

У меня есть массив двухбайтовых целых чисел, который я заполняю случайными 3-значными числами, используя ESI для перемещения по массиву. Я получаю нарушение доступа, когда пытаюсь получить доступ к 9-му элементу массива и хранить его в ESI.Нарушение доступа MASM x86 во время выполнения цикла

ARRAYSIZE = 200 

.data 
list  WORD ARRAYSIZE DUP(?) 

fillArray PROC 
    push OFFSET list 
    mov  esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO ESI 
    mov  ecx, request ;NUMBER OF ELEMENTS TO BE ADDED 

ArrFill: 
    ;calculate random 3-digit number, store in eax 
    dec  ecx 
    mov  [esi], eax ;THIS IS THE LINE THAT THROWS THE EXCEPTION 
    sub  esi, 2 
    cmp  ecx, 0 
    jnz  ArrFill 

Исключение брошено: нарушение прав доступа место для записи 0x00405FFE (Значение ESI при броске).

Когда я изменяю массив на четырехбайтовые целые числа, я также получаю нарушение доступа для попытки доступа к 5-му элементу массива по тому же адресу.

+0

Насколько велик массив, каждое значение составляет 16 бит, но сколько значений вы допустили? –

+0

EDIT: Обновлен код для добавления дополнительной информации. – hudspero

+0

См. Мой ответ ниже –

ответ

1
push OFFSET list 
mov  esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO ESI 

Почему не просто присвоить смещение ESI с mov esi, OFFSET list

mov  [esi], eax ;THIS IS THE LINE THAT THROWS THE EXCEPTION 

Поскольку массив содержит слов вы можете писать только содержимое AX, а не EAX! Используйте mov [esi], ax

sub  esi, 2 

Чтобы прогрессировать через массив вы должны добавить к указателю не вычитать из него. Использовать add esi, 2

+1

Большое спасибо. Я буду учитывать это. – hudspero

-1

Hudspero

Вы получаете нарушение прав доступа, потому что вы пытаетесь написать мимо границы массива.

Немногие вещи:

  1. , похоже Вы не должны инициализировать ecx. Вы должны инициализировать это до размера массива.
  2. Как вы cmp ecx,0 вы должны декремент ecx перед сравнением
  3. Вы должны переместить esi регулировки адреса после убедитесь, что вы не будете писать мимо границы. Я бы реструктурировать код, чтобы проверить ECX на ноль и выскочить, если оно истинно, в противном случае уменьшаем esi и перейти обратно к ArrFill
+0

Я включил строку , используя ecx в качестве счетчика специально для ссылки на то, что я использую ECX. Я не думал, что нужно включить его, но я сейчас. – hudspero

Смежные вопросы