Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742

Определение последовательности символов в строке [FASM]

29.10.2013, 22:53. Показов 3499. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо сравнить две строки и если в первой строке (ArrayZ) есть слова в последовательности по алфавиту (ArrayABC), записать их в ArrayRezult.

Пока себе не представляю как отследить эту последовательность, есть предложения?

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
33
34
35
36
37
38
39
40
41
42
43
44
45
format PE Console 5.0
entry Start
 
include 'win32a.inc'
 
section '.data' data readable writeable
i db 58
j db 26
k db ?
ArrayZ db 'abc set on the pipe, a drop, b lost, who stay on the pipe.',0
ArrayABC db 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',0
ArrayRezult db ?
 
section '.text' code readable executable
Start:
        movsx ecx, [i]
        lea esi, [ArrayZ]  ;адрес первого массива
        lea ebx, [ArrayRezult] ;адрес массива результата
point:
      lea edi, [ArrayABC]  ;адрес второго массива
      push ecx    ; заносим i(sizeof ArrayZ) в стек
      movsx ecx, [j] ; записываем j (sizeof ArrayABC) в регистр счетчика
k1:    
      xor eax, eax
      mov al, [esi]
      cmp al, [edi] ; сравниваем содержимое ячеек массивов
      je t1 ; если равны, выходим из цикла
      inc edi  ; если не равны, инкрементируем массив алфавита
      loop k1
t1:
      mov [ebx], al
      inc ebx ; инкремент ячейки массива результата 
      inc esi ; инкремент ячейки первого массива (строки)
      pop ecx ; достаем содержимое из стека
      loop point
Exit:
  invoke  ExitProcess, 0
 
 
section '.idata' import data readable
 
  library kernel, 'KERNEL32.DLL'
 
  import kernel,\
    ExitProcess, 'ExitProcess'
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2013, 22:53
Ответы с готовыми решениями:

В исходной строке а$ заменить все вхождения заданной последовательности символов x$ на другую заданную последовательность символов y$
В исходной строке а$ заменить все вхождения заданной последовательности символов x$ на другую заданную последовательность символов y$.

Определение в строке количества слов длиннее четырёх символов
Помогите с решением контрольных на C++. Пожалуйста. 2. Разработать программу, которая определяет в строке количество слов длиннее...

Подсчёт количества символов в строке (определение длины строки)
И еще одна маленькая задача, с первой связана лишь косвенно. Необходимо правильно выполнить выход из цикла. Этот скрипт считает...

17
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
30.10.2013, 18:21
Цитата Сообщение от Satansoft Посмотреть сообщение
ArrayZ db 'abc set on the pipe, a drop, b lost, who stay on the pipe.',0
Улыбнуло.
Цитата Сообщение от Satansoft Посмотреть сообщение
ArrayRezult db ?
Массив по моему, буфит маловат!
Цитата Сообщение от Satansoft Посмотреть сообщение
Необходимо сравнить две строки и если в первой строке (ArrayZ) есть слова в последовательности по алфавиту (ArrayABC), записать их в ArrayRezult.
Пока себе не представляю как отследить эту последовательность, есть предложения?
Думаю, надо сделать следущее.
1. Получить первый байт.
2. Проверить является ли он словом, или пробелом (если не пробел, значит слово).
3. Если пробелом, то пропустить все пробелы, пока не будет найдено слово.
4. И если словом, то подсчитать размер слова.

5.Дальше делать цикл проверок.
Сравнивать каждый байт слова из массива ArrayZ(побайтно), с каждым байтом в массиве ArrayABC. Цикл проверки, равен размеру полученного слова.
И когда длина строки (полученной из массива ArrayZ), закончится, увеличить начальный адрес на один байт в массиве ArrayABC и начать сравнивать с тем же слово ещё раз.
И делать это, пока не закончится массив ArrayABC.
Если последовательность найдена, то сохранить в массив ArrayRezult. После чего, найти следующее слово в массиве ArrayZ.
Если последовательность не найдена, то найти следующее слово в массиве ArrayZ.

6.Далее повторять цикл 5, пока не будет обработаны все слова, в массиве ArrayZ.
7.Всё.
Вот как-то, так.
1
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
30.10.2013, 20:45  [ТС]
Цитата Сообщение от XiloManX Посмотреть сообщение
Массив по моему, буфит маловат!
Всегда расширить можно, только он именно для результата создавался, а в моем коде, туда, fuckтически, весь ArrayZ перезаписывается.

Мой код: Сравнивает по-байтно каждый байт ArrayZ со всем массивом ArrayABC, разве только на пробелы не ориентируется, что мне не особо важно, и записывает в ArrayRezult только те символы, что совпали с ArrayABC. проблема же состоит в нахождении алфавитной последовательности.

Цитата Сообщение от XiloManX Посмотреть сообщение
Сравнивать каждый байт слова из массива ArrayZ(побайтно), с каждым байтом в массиве ArrayABC. Цикл проверки, равен размеру полученного слова.
Что значит: Цикл проверки, равен размеру полученного слова?

Цитата Сообщение от XiloManX Посмотреть сообщение
И когда длина строки (полученной из массива ArrayZ), закончится, увеличить начальный адрес на один байт в массиве ArrayABC и начать сравнивать с тем же слово ещё раз.
Мой код это и делает, где тут определение последовательности?
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
30.10.2013, 21:07
Цитата Сообщение от Satansoft Посмотреть сообщение
Всегда расширить можно, только он именно для результата создавался, а в моем коде, туда, fuckтически, весь ArrayZ перезаписывается.
лол. буфер на один байт, а ArrayZ состоит из туевой хучи байтов.
0
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
30.10.2013, 21:12  [ТС]
Цитата Сообщение от Мотороллер Посмотреть сообщение
лол. буфер на один байт, а ArrayZ состоит из туевой хучи байтов.
Да что ж такое то... категорически интересует определение последовательности! свести/расширить массив результата я всегда успею. Алгоритм нахождения последовательности подручными средствами ассемблера по прежнему не ясен.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
30.10.2013, 21:15
мой дибильный вариант: создаете новую строку такой же длинны, которой исходная. в нее забиваете алфавит по порядку до тех пор пока не встретися пробельный символ или символ конца строки. затем просто по строкам пройдите и проверьте их на равенство.
вид строк под дебагом:
first_str db 'asdf asfasf abcde asdfsafd aaad sdfd abcdef', 0
second db 'abcd abcdef abcde abcdefghigkl abcd abcd abcdef', 0
0
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
30.10.2013, 21:31  [ТС]
Цитата Сообщение от Мотороллер Посмотреть сообщение
мой дебильный вариант: создаете новую строку такой же длинны, которой исходная. в нее забиваете алфавит по порядку до тех пор пока не встретися пробельный символ или символ конца строки. затем просто по строкам пройдите и проверьте их на равенство.
Это лишь сравнивает слова в 2-х строках, мало что общего с поиском последовательности.

Добавлено через 6 минут
Ладно, вот моя вариация быдлоалгоритма: Перечислить последовательные вариации (благо их не много, позволяет)..."a", "ab", "abc"... сравнить и записать, возможно задать последовательность макросом или отдельным файлом и подключить, дабы быдлоалгоритм не стал говнокодом, каг вамъ, а? Раз местные жители без вариантом, юзнем такъ.
0
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
30.10.2013, 22:05
Цитата Сообщение от Satansoft Посмотреть сообщение
Что значит: Цикл проверки, равен размеру полученного слова?
КХеКХеКХе... ну, как бэ, если к примеру, полученная строка из 3 байт, то надо сравнить эти 3 байта, с 3 байтами в массиве ArrayABC, в цикле(3 раза=3 байта=размер слова). Далее. если слово в не последовательности, то увеличить адрес на 1 байт вперёд(ArrayABC), повторить сравнение этого же слова, и так далее, пока не будет найдена последовательность или не закончится массив ArrayABC. Больше не знаю, как объяснить. Как мог, объяснил.

Добавлено через 3 минуты
Вообщем, надо делать проверку слова, по всему массиву ArrayABC, до первого совпадения. И так, с каждым словом.
1
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
01.11.2013, 01:00  [ТС]
Цитата Сообщение от XiloManX Посмотреть сообщение
Вообщем, надо делать проверку слова, по всему массиву ArrayABC, до первого совпадения. И так, с каждым словом.
Идею понял, но в коде пока не знаю как реализовать.
Во-первых: не понятно как обращаться к словам, умею только по-символьно и как вообще обращаться, не к одному байту, а к 3-4, например?
Во-вторых: есть ли возможность вычислить sizeof() строки в ассемблере?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.11.2013, 03:20
Satansoft,
  • для обращения к байту ты используешь 8-разрядные регистры либо при обращении непосредственно к ячейке памяти пишешь byte ptr
  • для обращения к слову (2 байта), соответственно, придется использовать 16-разрядные регистры либо при обращении непосредственно к ячейке памяти — word ptr
  • для обращения к двойному слову (4 байта) — использовать 32-разрядные регистры либо при обращении непосредственно к ячейке памяти писать dword ptr
MASM поддерживает sizeof, TASM — нет
1
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
01.11.2013, 03:22  [ТС]
Mikl___, размерности это, имелось ввиду обратиться к слову в буквальном смысле.
abc set on the pipe, a drop, b lost, who stay on the pipe.
FASM использую.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.11.2013, 03:41
Цитата Сообщение от Satansoft Посмотреть сообщение
как вообще обращаться, не к одному байту, а к 3-4, например?
2 байта — слово
4 байта — двойное слово
16 байт — параграф
набери в Гугле "FASM использование sizeof" или читай учебник
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
01.11.2013, 03:52
Только недавно таже задачка была.Воспользуйтесь поиском по форуму.

изучите инструкци по работе со строками,тогда вопросов не будет возникать.И да,с адресацией разберитесь,это один из китов которые необходимо знать.
0
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
01.11.2013, 04:42
Цитата Сообщение от Satansoft Посмотреть сообщение
Во-первых: не понятно как обращаться к словам, умею только по-символьно и как вообще обращаться, не к одному байту, а к 3-4, например?
А побайтно, не вариант?
Цитата Сообщение от Satansoft Посмотреть сообщение
Во-вторых: есть ли возможность вычислить sizeof() строки в ассемблере?
Ты вообще понял, что сказал? Акстись, это Ассемблер! В нём, всё ручками надо делать. Хотя sizeof(), можно в сети найти, готовый.

Вот, специально для тебя, навоял на скорую руку. Не проверял, но должно работать.
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
; Процедура получения размера строки.
 
;input: term_number - максимальный размер, буфера (ecx=-1, если точно известно, что строка имеет уичтож. число).
;   string_addr - адрес строки в буфере, размер которой, надо получить.
;   buf_length  - уничтожающее число.
 
;output: [удача] CF (cf=0), EAX = размер строки, в байтах.
;                            edi- адрес конца строки (с учётом уничтожающего числа).
;    [неудача] CF (cf=1)
 
proc str.get_length  term_number:BYTE, string_addr:DWORD, buf_length:DWORD
    cld
    mov ecx, [buf_length]   ;максимальный размер, буфера (ecx=-1, если точно известно, что строка имеет уичтож. число).
    mov edi, [string_addr]  ;адрес строки в буфере, размер которой, надо получить.
    mov al, [term_number]   ;al = уничтожающее число.
    repne   scasb
    jne .error   ;ошибка, уничтожающее число не найдено.
 
    ;вычисляем размер строки (eax = размер строки в байтах).
    mov eax, [buf_length]
    sub eax, ecx
    dec eax
    jmp .exit
.error:
    stc
.exit
    ret
endp
Assembler
1
2
3
4
5
6
7
8
; Пример использования.
 
ascii_space = 0x20
 
    mov esi, ArrayZ
 
    stdcall  str.get_length  ascii_space, esi, -1
    jc .exit
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.11.2013, 11:06
честно говоря, я вообще не понимаю, ЧТО тут обсуждать?
  1. получаешь первый символ в слове, увеличиваешь его значение на единичку и сравниваешь со вторым, если не совпали, то двигаемся до пробела и повторяем операцию сначала
  2. если значение второго символа больше значения первого на единицу — увеличиваем значение этого символа на единицу и сравниваем с третьим, не совпали — идем к пункту "а", совпали — увеличиваем значение третьего символа на единицу и сравниваем с четвертым значением и т.д. пока не встретим пробел или конец строки
  3. слово, которое прошло пункт "b" до конца — записываем в буфер или выводим на экран
интересно, попадают ли под определение "слово из символов в алфавитной последовательности" слова, состоящие из одного символа? или следует оговориться, что если слово из одного символа, то его не рассматривают?
1
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
01.11.2013, 17:08  [ТС]
Цитата Сообщение от Mikl___ Посмотреть сообщение
получаешь первый символ в слове, увеличиваешь его значение на единичку и сравниваешь со вторым, если не совпали, то двигаемся до пробела и повторяем операцию сначала
Получается только каждый символ первой строки сравнить с каждым второй, как если не совпали, то двигаемся до пробела и повторяем операцию сначала?

Цитата Сообщение от Mikl___ Посмотреть сообщение
если значение второго символа больше значения первого на единицу
как отследили это значение? единственный видимый мною вариант отслеживания позиции символа - ориентир на содержимое ecx

Цитата Сообщение от Mikl___ Посмотреть сообщение
слово, которое прошло пункт "b" до конца — записываем в буфер или выводим на экран
интереснейший вариант, но слово записывается лишь по-символьно и я, сравнивая, записываю лишь совпавшие символы, которые затем уже формируют слово... видимо нужен промежуточный массив для хранения слова, пока оно не прошло проверку, а затем уже записать в результат?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
02.11.2013, 03:48
Цитата Сообщение от Satansoft Посмотреть сообщение
Получается только каждый символ первой строки сравнить с каждым второй, как если не совпали, то двигаемся до пробела и повторяем операцию сначала?
Цитата Сообщение от Satansoft Посмотреть сообщение
если значение второго символа больше значения первого на единицу
как отследили это значение? единственный видимый мною вариант отслеживания позиции символа - ориентир на содержимое ecx
Assembler
1
2
3
4
5
6
lodsb; получили очередной символ
inc al;увеличили значение в AL на 1
cmp al,[si]; в SI адрес следующего символа
je next;если совпали
mov al,' ';ищем символ пробела
repne scasb
Цитата Сообщение от Satansoft Посмотреть сообщение
но слово записывается лишь по-символьно и я, сравнивая, записываю лишь совпавшие символы, которые затем уже формируют слово... видимо нужен промежуточный массив для хранения слова, пока оно не прошло проверку, а затем уже записать в результат?
Ты пишешь программу - тебе и решать как ее организовывать
1
 Аватар для Satansoft
20 / 16 / 7
Регистрация: 27.02.2012
Сообщений: 742
06.11.2013, 17:48  [ТС]
Проверяя пропускает часть букв и как представить промежуточный буфер, в который будут записываться буквы слова, пока не встретят пробел, а затем в массив результата?

Довольно кривой кусок, но как пропустить символ в проверяемой строке?
Assembler
1
2
cmp al, ' '
je begin

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Start:
lea esi, [ArrayZ]
lea edi, [ArrayRezult]
movsx ecx, [i]
xor eax, eax
 
begin:
mov al, [esi]  ;записываем первый эл. строки в al
inc esi        ; переходим на 2-й лемент строки
cmp al, ' '
je begin
cmp al, 0
je Exit
cmp al, [esi]  ; сравниваем элемент со следующим
jna o1         ; если <= то записываем в массив результата
loop begin     
 
o1:
mov [edi], al
inc edi
jmp begin        
Exit:
Добавлено через 1 час 9 минут
И вот еще что, я бы может и рад
Assembler
1
cmp al, [esi]  ; сравниваем элемент со следующим
записать как
Assembler
1
cmp al, [esi+1]  ; сравниваем элемент со следующим
но это не верно, как обратиться к содержимому следующей ячейки памяти?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2013, 17:48
Помогаю со студенческими работами здесь

Определение какой из двух заданных символов встречается чаще в строке
ПОМОГИТЕ ПЛИЗ! Сделал чтобы выводились два символа но чот туплю, как сделать, чтобы выбралось которое чаще встречается из них static...

Определение какой из двух заданных символов встречается чаще в строке
Разработать программу, которая для заданной строки s: определяет, какой из двух заданных символов встречается чаще в строке.(C# Windows...

Поиск в строке последовательности символов
составьте программу, которая в заданной строке найдет последовательность символов &lt;B4&gt; и заменит их на &lt;B52&gt;, из получившейся...

Удаление определенной последовательности символов в строке
Здравствуйте! Есть строка (массив символов). Нужно найти наиболее длинную цепочку с повторяющимися символами и заменить ее числом...

Регулярные выражения: поиск последовательности символов в строке
Как сделать так, чтобы js возвращал true, если найдет в совершенно любой строке определенную последовательность симоволов. В масках...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru