WMmail.ru - сервис почтовых рассылок

суббота, 26 июня 2021 г.

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

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


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Это сообщение сформировано и выслано с помощью Sendsay.Ru

Комментариев нет:

Отправить комментарий