Консультация # 201197: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Не могу понять как исправить код программы на ТАСМ так чтобы введенное слово вставлялось после выбранного а не перед, подскажите пожалуйста
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Не могу понять как исправить код программы на ТАСМ так чтобы введенное слово вставлялось после выбранного а не перед, подскажите пожалуйста
Код
pushad // Сохранение состояния mov ecx, S_Len // Получение разности длин строки и искомого слова sub ecx, W1_Len jc EndLine // Искомое слово больше длины строки - сразу выход inc ecx // Коррекция указателя для кол-ва циклов сдвига окна M1 : push ecx // Цикл движения окна по строке НАЗАД lea esi, [ecx + Buf - 1] // Указатель на положения окна на строке lea edi, W1 // Указатель на искомое слово mov ecx, W1_Len // Длина искомого слова - счётчик цикла сравнения букв repe cmpsb // Сравнение окна строки и искомого слова jnz Next // Совпадения нет - искать дальше // Для признания совпадения также необходимо выполнение двух условий: // 1) после окна находится пробел или конец строки // 2) перед окном находится пробел или оно начинается с начала строки cmp byte ptr[esi], ' ' // Проверка на пробел после окна je EQ1 cmp byte ptr[esi], 0 // Проверка на конец строки после окна jne Next EQ1 : sub esi, W1_Len // Получение указателя на начало окна lea eax, Buf cmp esi, eax // Проверка на начало строки je EQ2 cmp byte ptr[esi - 1], ' ' // Проверка на пробел перед окном jne Next EQ2 : // Слово найдено - можно переходить к вставке push esi // Сохранение указателя на начало окна lea ecx, Buf // Вычисление количества сдвигаемых символов add ecx, S_Len // (от начала окна и до конца строки) push ecx // Сохранение указателя на конец строки sub ecx, esi inc ecx pop esi // и установка его в качестве источника данных для сдвига mov edi, esi // Приёмник данных сдвинут на длину вставляемого слова + 1 add edi, W2_Len inc edi std // При сдвиге сканировать НАЗАД rep movsb // Сдвиг строки перемещением элементов mov ecx, W2_Len // Увеличение размера строки на длину вставляемого слова + 1 add S_Len, ecx inc S_Len pop edi // Указатель на место для записи вставляемого слова (начало окна) lea esi, W2 // Указатель на вставляемое слово cld // Копирование ВПЕРЁД rep movsb // Вставка слова mov byte ptr[edi], ' ' // Дописывание пробела Next:pop ecx // Поиск следующего слова в строке loop M1 EndLine : popad // Восстановление состояния
метка М1 esi - указывает на начало, либо строки, либо любого слова(т.е. [ esi-1 ] = " "), edi - начало искомого слова;
сравнение repe cmpsb;
увеличение строки rep movsb;
вставка строки rep movsb;
метка Next: - пропуск - поиск разделителя(ей) - repe или repne scasb, при al=20h и переход на метку М1. В esi - нужно будет записать начало очередного слова из edi. Скорее всего назначенение esi,edi нужно будет поменять местами, из-за scasb.
Также можно с помощью scasb найти разделитель в строке, вычислить длину очередного проверяемого слова. Если длина проверяемого слова и искомого совпадает, то переходить к сравнению - вставке.
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
Если выпуск не отображается, вы можете прочесть его на сайте
Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru. Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.
Комментариев нет:
Отправить комментарий