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 // Восстановление состояния
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.