Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Kdsfofwe21
Статус: 2-й класс
Рейтинг: 121
∙ повысить рейтинг »
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 1
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »

Assembler

Номер выпуска:1790
Дата выхода:26.06.2021, 14:15
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:4 / 25
Вопросов / ответов:1 / 1

Консультация # 201197: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Не могу понять как исправить код программы на ТАСМ так чтобы введенное слово вставлялось после выбранного а не перед, подскажите пожалуйста
...

Консультация # 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                       // Восстановление состояния

Дата отправки: 21.06.2021, 13:51
Вопрос задал: KoreanLamer (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Доброе время суток!

Предлагаю Вам поменять подход к работе.

  1. метка М1 esi - указывает на начало, либо строки, либо любого слова(т.е. [ esi-1 ] = " "), edi - начало искомого слова;
  2. сравнение repe cmpsb;
  3. увеличение строки rep movsb;
  4. вставка строки rep movsb;
  5. метка Next: - пропуск - поиск разделителя(ей) - repe или repne scasb, при al=20h и переход на метку М1. В esi - нужно будет записать начало очередного слова из edi. Скорее всего назначенение esi,edi нужно будет поменять местами, из-за scasb.


Также можно с помощью scasb найти разделитель в строке, вычислить длину очередного проверяемого слова. Если длина проверяемого слова и искомого совпадает, то переходить к сравнению - вставке.

Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 26.06.2021, 11:33
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное