Ошибка правильного сравнения строк в сборке Intel - PullRequest
0 голосов
/ 17 апреля 2020

Моя цель - сравнить две строки . Если они равны, продолжайте программу. Если не равно, ветвь где-то еще. Если я не в конце строки и пока все равно, l oop соответствует следующему символу.

Я использую visual studio, inline intel asm.

программа работает, хотя при первом запуске она принимает ветвь NOTSAME и завершает программу, даже если сравниваемые строки одинаковы. Это не Я oop вообще из-за этого, что означает, что что-то идет не так в сравнении.

Я попытался отладить его, и, похоже, регистры содержат правильный адрес. По моему мнению, увеличивать / уменьшать его можно, увеличивая его, просто перемещая указатель на один байт вперед, указывая на следующий символ. У меня нет четкого представления о том, какая часть идет не так, я просто знаю, что это не сравнивается с тем, как я планировал.

int main()
{
    string arr[] = {"a","b","c","d","e" };

    string a= "a";

__asm
    {

        lea esi, arr // load address into esi
        lea edi, a
        dec edi

        LOOPING:
        inc edi// ds:di->next character in string2
        lodsb// load al with next char from string, lodsb increments si automatically.
        cmp[edi], al//; compare characters
        jne NOTSAME//; jump out of loop if they are not the same
        cmp al, 0//; they are the same, but end of string ?
        jne LOOPING//; no - so go round loop again

После некоторой дополнительной отладки кажется, что AL не принимает правильный байт из строки. Пока не знаю, почему.

1 Ответ

0 голосов
/ 18 апреля 2020

Так что по какой-то причине LEA сохранил адрес за 4 байта до того, где начинается строка. Я не уверен, почему это так, но чтобы исправить это, я добавил 4 байта в каждый регистр (указатели), и они оба скорректированы и теперь сравниваются должным образом. Изменено следующее

lea esi, a// load address into esi
lea edi,arr
add edi,4
add esi,4
...