Проблема сравнения символов сборки - PullRequest
0 голосов
/ 17 октября 2010

Мы пытаемся реализовать алгоритм расстояния левенстинг в сборке и вызываем функцию сборки из кода 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
// это должно быть равно, но не

1 Ответ

5 голосов
/ 17 октября 2010
mov edx,[edx]
mov ecx,[ecx]
cmp edx,ecx

Я думаю, вы сравниваете слова вместо байтов.

Попробуйте

mov dh, byte ptr [edx]
mov ch, byte ptr [ecx]
cmp dh, ch
...