Похоже, вы используете тот же буфер для обратной строки, который вы использовали для начального ввода. Строка1 содержит тот же указатель, что и строка2. Так что, конечно, они сравниваются равными; по крайней мере, это хороший признак того, что остальная часть вашего кода может работать.
Когда эти значения в конечном итоге сравниваются, они всегда устанавливают нулевой флаг, независимо от того, равны ли значения
cmp al,dl
определенно не установит ZF, если значения в al
и dl` отличаются. Если вы думаете, что это происходит, вы используете свой отладчик неправильно. Это должно позволить вам проверять регистры / память, пока вы выполняете пошаговый код. В идеале даже выделение регистров, которые были изменены последней инструкцией.
Ваш неуклюжий неэффективный алгоритм выглядит так, как будто он будет работать, если вы используете отдельный буфер, если других ошибок нет.
Неэффективно, потому что он повторяется один раз, чтобы расширить строку до 4 байтов на символ в стеке, затем повторяется по нему снова для сохранения в буфере, а затем повторяется по нему снова , чтобы проверить равенство.
Стандартный алгоритм состоит в том, чтобы начинать с указателей на голову / хвост и l oop, пока они не встретятся в середине, O (n) времени, O (1) дополнительного пробела и в лучшем случае O (1) времени выполнения, если первый / последний байты отличаются. (Обращение сначала стоит O (n) времени и дополнительного пространства, прежде чем делать хотя бы одно сравнение). На x86 вы можете даже проверять 4 или 16 байтов за раз с bswap
или pshufb
, чтобы инвертировать байты в целочисленном или XMM-регистре, еще больше уменьшая постоянный коэффициент. (Но если сделать короткие строки особым случаем.)
Кстати, ваше сравнение l oop также может быть оптимизировано:
Обратите внимание, что если al != 0
, вы можете поймать dl == 0
регистр конца строки как часть al != dl
. Реализация strcmp
должна проверять только строки друг против друга и одну строк на завершающий ноль.