2016-11-22 109 views
1

我正在開發一個項目,我目前在我的一行中遇到訪問衝突。我想知道我是否可以對錯在哪裏得到第二個意見。這裏是我的代碼(注意,我在運行時出現錯誤,但它確實建):訪問衝突MASM x86程序集

.data 
BlueTextOnGray = blue + (lightGray * 16) 
DefaultColor = lightGray + (black * 16) 
arrayD SDWORD 12345678h,1A4B2000h,3434h,7AB9h 

fib BYTE 1,2 
    BYTE NUMBER_FIBS_TO_COMPUTE dup(0) 

prompt BYTE "Enter an ending integer: ",0 
error BYTE "Invalid stopping point! 



.code 

main PROC 

    mov eax,BlueTextOnGray 
    call SetTextColor 
    call Clrscr   ; Clear the screen 
    call Crlf   ; New line 

    mov edx,OFFSET prompt 
    call WriteString 
    call ReadInt   ; Input integer into EAX 
    call Crlf   ; New line 

    lea esi, [fib+2] 
    mov cl, NUMBER_FIBS_TO_COMPUTE 
@@: 
    mov al, [esi-2] 
    add al, [esi-1] 
    mov [esi], al ;<------------This is where the error occurs 
    inc esi 
    loop @B 

; here print out the results or examine them with debugger 

E1: call Crlf   ; New line 
    call WaitMsg   ; "Press any key..." 
    mov eax,DefaultColor 
    call SetTextColor 
    call Clrscr 



exit 
main ENDP 
END main 

有沒有辦法,我缺少的規則。我已經完成了我的研究,但似乎無法找到符合我的情況的答案。

任何幫助將是偉大的! (另外請注意,我沒有這樣做,所以可能會有其他錯誤。)

謝謝!

+2

'fib'在哪裏?還要注意'loop'使用'ecx'而不是'cl',所以你應該設置它的全部32位。 – Jester

+0

@Jester 'fib'在'.data'字段中初始化。 我在原文中添加了以上內容 – LAMBY

+0

當您的代碼出錯時,ESI有什麼值? 「fib」有多遠? ECX裏有什麼,你爲什麼不讀Jester評論的後半部分? –

回答

0

您的問題是,無論何處fib指向哪個加載到esi,該內存頁被標記爲只讀。

通常,嘗試寫入GDT中標記爲只讀的內存位置會導致訪問衝突。當您嘗試從內存位置讀取進程完全無法訪問時,會發生分段錯誤。

正如@Jester指出的那樣,您沒有關注ECX中的高位位。當您在CL中設置循環控制值時,由於ECX未知,您的循環可能運行得遠遠超出您的預期。這會很快讓你進入只讀區域。

+0

數據部分沒有正確定義「fib」? IDK MASM,但我認爲這是讀寫。我認爲代碼只是運行WAY多次迭代而不是預期,因爲像Jester最初指出的ECX中的垃圾很多,所以當指針增量到達一個未映射的頁面時它會出錯。 –

+0

這也可能是一個問題,但我無法看到他將其設置到任何有效內存區域的位置。 –

+0

嗯......再看一遍,我認爲你是對的。傑斯特擁有它。 –