2016-11-04 70 views
0

這可能是什麼原因造成的?我是彙編(asm)編程的新手,我對我的代碼中發生的事情感到沮喪,因爲我一直試圖弄清它幾個小時。Project.exe中0x00406A09引發的異常:0xC0000005:執行地址0x00406A09的訪問衝突

.data 
stringInput BYTE 21 dup (0) 
wrongInput BYTE "That is incorrect", 0 
correctInput BYTE "That is correct you win", 0 
inputSize = 20 

.code 
push EDX 
mov EDX, OFFSET stringInput 
mov ECX, inputSize 
call readString 

loopWord: 
mov AL, [ESI] 
mov BL, [EDX] 
cmp AL, 0 
jne loopWord2 
cmp BL, 0 
jne loopWord2 
jmp loopWord4 

loopWord2: 
inc ESI         ;point to the next 
inc EDX         ;point to next element 
cmp AL, BL        ;is the letter equals? 
je loopWord        ;IF EQUAL loop again 
jne loopWord3       ;not equal go out 
pop EDX 

loopWord3: 
mov EDX, OFFSET wrongInput 
jmp WordFinish 

loopWord4: 
mov EDX, OFFSET correctInput 
jmp WordFinish 


WordFinish: 
call WriteString 
RET         ;the exception is thrown here 
WordMatching ENDP 

我很確定代碼工作正常,直到返回部分。 PS:我還有其他的代碼,其中將調用wordMatching PROC。

+0

如果已達到_either_ string('[esi] == 0 || [edx] == 0')的末尾,則應該退出循環。如果'[esi] == 0 && [edx] == 0',你當前會退出。 – Michael

+0

我認爲jmp loopWord4等於退出循環。 loopWord4只是打印一個字符串,然後將其返回給調用語句 – Beginnerstudent

+0

只有在同一次迭代中,如果_both_'[esi] == 0'和'[edx] == 0'到達'jmp loopWord4', '[esi] == 0 && [edx] == 0'。這不是你想要的。只要您到達_either_字符串的末尾,就要退出循環。 – Michael

回答

0

在代碼的開始處放置一個斷點(在執行push EDX之前),記下堆棧地址esp加堆棧中的值(返回給調用者的地址)。

然後在ret處放置一個斷點。運行代碼。檢查esp

(你永遠不會執行pop EDX,你有它的代碼,但它是對je + jne,所以實際上無法訪問)。

關於邏輯比較,你可以把它簡化了很多:

.code 
    push EDX 
    mov EDX, OFFSET stringInput 
    mov ECX, inputSize 
    call readString 

    mov EBX, OFFSET wrongInput 
loopWord: 
    mov AL, [ESI] 
    cmp AL, [EDX] 
    jne loopWord_wrongInput ; first difference -> wrongInput 
    inc ESI 
    inc EDX 
    test AL,AL 
    jnz loopWord ; until 0 is found in both strings 
; here is the branch for correct word 
    mov EBX, OFFSET correctInput ; no difference -> switch result string 
loopWord_wrongInput: 
    ; display result string 
    mov EDX,EBX 
    call WriteString 
    pop EDX   ; your missing "pop EDX" fixed here 
    ret 

編輯:我忘了增加ESI/EDX在第一個版本,現在是固定的。

相關問題