Мы пытаемся реализовать алгоритм расстояния левенстинг в сборке и вызываем функцию сборки из кода C.Но у нас есть проблема сравнения символов, и мы не смогли ее решить.
Функция принимает два параметра char *.В первых двух строках я перемещаю эти адреса в ecx и edx.iminusOne и jminusOne являются индексами для получения текущих (кодовый блок является частью цикла) символов. После нахождения адресов символов я перемещаю символы в регистры и сравниваю их с помощью cmp.Но, например, когда я сравниваю две строки «яблоко» и «яблоко», первые три символа кажутся одинаковыми, а два других - нет.Я печатаю в консоль символы по адресам, которые хранятся в ecx и edx, они также кажутся равными.
mov ecx,[esp+4]
mov edx,[esp+8]
mov ebx,[iminusOne]
add ecx,ebx
mov ebx,[jminusOne]
add edx,ebx
call printCurrentChars
mov edx,[edx]; bellekteki veriyi direk register a yüklüyoruz çünkü karşılaştırma
; işlemine parametre olarak iki adres alanı veremiyoruz
mov ecx,[ecx]
cmp edx,ecx
jne notEqual
call printHello
mov ebx,eax
Результат печати текущих символов:
appleapple
aa
Привет, мир!// OK
ap
ap
al
ae
pa
pp
Привет, мир!// OK
pp
// это должно быть равно, но не
pl
pe
pa
pp
// это должно быть равным, но не
pp
Привет, мир!
pl
pe
la
lp
lp
ll
// это должно быть равно, но не
le
ea
ep
ep
el
ee
// это должно быть равно, но не