В чем может быть причина этого? Я новичок в программировании сборки (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.
Вы должны выйти из цикла, если вы достигли конца строки _either_ ('[esi] == 0 || [edx] == 0'). В настоящее время вы выходите, если '[esi] == 0 && [edx] == 0'. – Michael
Я думаю, что jmp loopWord4 равен завершению цикла. loopWord4 просто печатает строку, а затем возвращает ее в оператор вызова – Beginnerstudent
Единственный раз, когда вы достигаете 'jmp loopWord4', является if _both_' [esi] == 0' и '[edx] == 0' на той же итерации, т.е. '[esi] == 0 && [edx] == 0'. Это не то, что вы хотите. Вы хотите выйти из цикла, как только вы достигнете конца строки. – Michael