С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
7 / 7 / 0
Регистрация: 14.11.2014
Сообщений: 166
1

Cтрока: Найти количество слов, в которых первый и последний символ совпадают.

27.01.2017, 18:13. Показов 1404. Ответов 4

Author24 — интернет-сервис помощи студентам
Прошу помощи! Уже извели эти задачи. На ум ничего хорошего не приходит. Подскажите, пожалуйста с реализацией такой задачи:
Найти количество слов, в которых первый и последний символ совпадают.
Также есть желание использовать следующие команды(суть их знаю, но применить не получается): movs, scas, lods, cmps, stos.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2017, 18:13
Ответы с готовыми решениями:

Найти количество слов, у которых совпадают первый и последний символ
Дана символьная строка. найти количество слов у которых совпадают первый и последний символ....

Найти количество слов,у которых первый и последний символ совпадают
Даны натуральное число n, символы s1....sn, Группы символов,разделенные пробелами(одним или...

Найти количество слов, первый и последний символ которых совпадают
помогите написать программу... дана строка символов. группы символов, разделенные 1 или неск-ми...

Дан текст, найти количество слов и количество слов, у которых первый и последний символ совпадают
Помогите пожалуйста, выполнить задание. Дан текст из N символов. Группы символов, расположенные...

4
Asm/C++/Delphi/Py/PHP/VBA
6750 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
28.01.2017, 10:28 2
Лучший ответ Сообщение было отмечено Asya_inter как решение

Решение

Есть у нас строка и размер строки:
Assembler
1
2
String db 'Hello   goog and yay   world! '
lString = $-String  ; длина строки
И дальше поиск:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  xor dx,dx  ; dx = 0 - кол-во найденных слов
  lea di,String
  mov cx,lString+1  ; cx должен быть на 1 больше реальной длины строки, иначе на последней итерации [di-2] будет указывать на предпоследний символ последнего слова (если только в конце нет пробелов)
  mov al,' '  ; слова разделяются пробелами (знаки препинания являются частью слова!)
@@repeat:
  mov ah,[di]  ; первый символ
  repne scasb  ; сканируем не более cx символов, пока es:[di] <> al
  ; здесь мы имеем: либо cx=0 (значит это конец строки) и di=следующий за последним символ (поэтому cx изначально должен быть на 1 больше реальной длины строки),
  ; либо di указывает на следующий после пробела символ
  cmp [di-2],ah  ; сравниваем последний символ с первым
  jne @@notequal  ; прыгаем, если не равны
  inc dx  ; равны, увеличиваем счётчик кол-ва найденных слов
@@notequal:
  repe scasb  ; пропускаем все пробелы (вдруг их несколько подряд)
  jcxz @@finish  ; если конец строки, сразу выходим (это нужно делать здесь, а не строкой выше, т.к. String может содержать пробелы в конце, и тогда после inc cx мы бы сделали ещё один "лишний" цикл)
  dec di  ; т.к. scasb захватит 1 лишний символ, уменьшаем di на 1
  inc cx  ; и счётчик тоже увеличиваем (он же сработал для этого символа)
  jnz @@repeat  ; если cx <> 0, продолжаем поиски
@@finish:
  ; в финале dx = кол-во таким строк
1
7 / 7 / 0
Регистрация: 14.11.2014
Сообщений: 166
29.01.2017, 14:21  [ТС] 3
Jin X, большое вам спасибо! Строки дались мне сложновато. Целых два дня возится пришлось с уже готовым решением , так как проблема заключалась в том, что у меня вначале было неправильное занесение в регистр:
Assembler
1
2
3
mov dx,[edi]
     repne scasb
     cmp dx,[edi-2]
Глупая ошибка. Нельзя было использовать dx.
Так как мне нужно на встроенный ассемблер, то это переделанный немного вариант:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
program z_V;
{$asmmode intel}
var
  s : string[255];
  l : longint;
  k, res : integer;
begin
  readln(s);
  l := length(s);
 asm
  mov ecx,l;
  inc ecx
  lea edi,[s]
  mov al,' '
  inc edi
  @repeat:
     mov dl,[edi]
     repne scasb
     cmp dl,[edi-2]
     jne @land
         inc k
     @land:
        repe scasb
        jcxz @finish
        dec edi
        inc ecx
        cmp ecx,0
        jne @repeat
     @finish:
 end;
 writeln('k = ', k);
end.
Спасибо!!!
0
Asm/C++/Delphi/Py/PHP/VBA
6750 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
29.01.2017, 17:16 4
Цитата Сообщение от Asya_inter Посмотреть сообщение
jcxz @finish
jecxz правильнее будет (хотя, jcxz тоже будет работать для строк до 65536 байт, но лучше заменить).

Цитата Сообщение от Asya_inter Посмотреть сообщение
Assembler
26
27
28
        inc ecx
        cmp ecx,0
        jne @repeat
cmp здесь не нужен, т.к. inc уже выставит флаги как надо (он не влияет только на флаг cf).

Цитата Сообщение от Asya_inter Посмотреть сообщение
Assembler
13
14
15
  lea edi,[s]
  mov al,' '
  inc edi
можно упростить до:
Assembler
1
2
  lea edi,[s+1]
  mov al,' '
Ещё я не знаю, что тут за паскаль конкретно, но обычно ebx, esi, edi нужно сохранять при изменении? т.е. добавить в начало push edi, в конец - pop edi.

Добавлено через 3 минуты
Цитата Сообщение от Asya_inter Посмотреть сообщение
l := length(s);
asm
mov ecx,l;
inc ecx
Это тоже можно сделать вот так:
Assembler
1
2
movzx ecx,byte ptr [s]
inc ecx
2
ФедосеевПавел
29.01.2017, 18:56     Cтрока: Найти количество слов, в которых первый и последний символ совпадают.
  #5

Не по теме:

Asya_inter, вы опять "сметаете" все регистры и опять рискуете получить SOS! Магия с assembler + pascal.
В Windows всё сильнее ограничено нежели в DOS.

0
29.01.2017, 18:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2017, 18:56
Помогаю со студенческими работами здесь

Символьный массив: найти количество слов, в которых первый и последний символ совпадают
Необходимо найти количество слов, в которых первый и последний символ совпадают. Помогите,а)

Подсчитать количество слов, у которых первый и последний символ совпадают
Ввести текст. Подсчитать количество слов, у которых первый и последний символ совпадают между собой.

Посчитать количество слов в строке, у которых первый и последний символ совпадают
Помогите, пожалуйста! 3 день ломаю голову... Есть задание: Написать метод, входным параметром...

Строка: Вернуть количество слов в строке, у которых первый и последний символ совпадают...
Написать функцию, входным параметром которой является строка. Функция должна вернуть количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru