2016-11-04 6 views
0

В чем может быть причина этого? Я новичок в программировании сборки (asm), и я отчасти разочарован тем, что происходит в моем коде, потому что я пытался понять это часами.Исключение бросили в 0x00406A09 в Project.exe: 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_ ('[esi] == 0 || [edx] == 0'). В настоящее время вы выходите, если '[esi] == 0 && [edx] == 0'. – Michael

+0

Я думаю, что jmp loopWord4 равен завершению цикла. loopWord4 просто печатает строку, а затем возвращает ее в оператор вызова – Beginnerstudent

+0

Единственный раз, когда вы достигаете 'jmp loopWord4', является if _both_' [esi] == 0' и '[edx] == 0' на той же итерации, т.е. '[esi] == 0 && [edx] == 0'. Это не то, что вы хотите. Вы хотите выйти из цикла, как только вы достигнете конца строки. – 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 

редактировать: Я забыл увеличиваем еси/EDX в первой версии, теперь исправлена.

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

  • Нет связанных вопросов^_^