2016-02-28 60 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值)。

當我將數組更改爲四字節整數時,我也遇到訪問衝突,以嘗試訪問同一地址處的數組的第五個元素。

+0

陣列有多大,每個值是16位,但您允許多少個值? –

+0

編輯:更新代碼以添加更多信息。 – 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你應該比較
  3. 你保證你不會寫過去的邊界後,您應該移動esi地址調整前遞減ecx。我會重組代碼來測試ECX零,如果真的跳出來,否則遞減esi和跳回ArrFill
+0

我包括行 ;使用ecx作爲計數器 專門用於引用我使用ECX的事實。我不認爲有必要包括它,但現在我會。 – hudspero