Консультация № 201197
21.06.2021, 13:51
0.00 руб.
1 2 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Не могу понять как исправить код программы на ТАСМ так чтобы введенное слово вставлялось после выбранного а не перед, подскажите пожалуйста

Код:
 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 // Восстановление состояния

Прикрепленные файлы:

Обсуждение

давно
Старший Модератор
31795
6196
23.06.2021, 15:22
общий
Адресаты:
Вы как-то хитроумно производите проверку наличия слова в строке

и двигаете Окно в строке к началу строки.

Предлагаю Вам изменить подход к поиску к примеру так:


[code lang=asm];начальная настройка
mov esi,string
mov edi,word
mov ecx,sizestring
;сбрасываерм позицию прорвеяемого символа
@@01: xor ebx,ebx
;грузим очереднойр символ в слове и провеяем его на совпадение
@@02: mov al,[edi+ebx]
cmp al,[esi+ebx]
jnz noequ
;пеереходим к следующему порвеяремому символу
inc ebx
jmp @@02
;не совпало поверяем ноль
noequ: or al,al;
jnz next
;проверяем пробел
mov al,20h
cmp al,[esi+ebx];
jnz next
;
;нашли слово - вставляем слово
;
;переходим к следующему символу
next: inc esi
loop @@01[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
26.06.2021, 11:33
общий
это ответ
Доброе время суток!

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

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


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

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа