Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/91: Рейтинг темы: голосов - 91, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 21
TASM

Поиск подстроки в строке

21.06.2012, 14:08. Показов 18799. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте, помогите пожалуйста в написании программы под TASM.
задача: Найти индекс первого вхождения подстроки S0 в строку S.
честно говоря со строками в asm'е работать толком не умею, поэтому прошу вашей помощи.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2012, 14:08
Ответы с готовыми решениями:

Ввести с клавиатуры строку. Найти шаблон во введенной строке (поиск подстроки в строке)
Помогите написать программу. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку - шаблон. Найти шаблон во введенной строке....

Поиск подстроки в строке
Можете помочь исправить ошибку ; Лабораторная работа №4 ; Манякин Алексей, вариант 8 ; Программа определяет первое вхождение S2 в...

Поиск подстроки в строке
Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то, начиная с какой...

12
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.06.2012, 14:39
Это когда с клавиатуры вводишь строку, вторую строку и ищешь полное совпадение второй строки с частью первой?
0
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 21
21.06.2012, 15:22  [ТС]
вроде того.
строки необязательно вводить, можно сразу задать.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.06.2012, 15:27
Цитата Сообщение от kolobot Посмотреть сообщение
строки необязательно вводить, можно сразу задать.
Как тогда проверить?
0
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 21
21.06.2012, 15:45  [ТС]
ну вот допустим
Assembler
1
2
S       db     'lopata*opa'    ;основная строка
So     db     'opa'               ; подстрока
нужно найти индекс первого вхождения So в S, в данном случае это будет 2, т.к. 'opa' в первый раз встречается в строке со 2-го символа.
я не знаю как это запрограммировать.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.06.2012, 15:53
Так-то можно, но это если для себя (себя не обманешь). Лучше и наверное правильней вводить с клавиатуры?
0
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 21
21.06.2012, 16:04  [ТС]
так то да)
мне бы главное сам алгоритм действий)
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.06.2012, 16:21
Поиск первого символа подстроки в строке
Если нашли, то сравнить оставшиеся символы
Отнять адрес начала строки от аадреса подстроки в строке – индекс.
0
16 / 10 / 0
Регистрация: 14.06.2012
Сообщений: 25
21.06.2012, 17:18
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
.model tiny
.code
org 100h
start:
jmp main
 
S1 db 'lopaqwe*opa', 0      ; строка
S0 db 'opa', 0          ; подстрока
len1 db 0               ; длина строки
len0 db 0               ; длина подстроки
found db ?
 
main proc
    push offset S0      ; передаем подстроку вторым параметром
    push offset S1      ; передаем строку первым параметром
    call InStr1         ; определение индекса подстроки (если не найдена - 0)
    aam
    push ax
    test ah, ah
    jz @m1
    or ah, 30h
    mov dl, ah
    mov ah, 06
    int 21h
    @m1:
    pop ax
    or al, 30h
    mov dl, al
    mov ah, 06
    int 21h
    mov ah, 00
    int 16h
    ret
main endp
 
InStr1 proc
    str1 equ [bp+4]     ; первый параметр
    str2 equ [bp+6]     ; второй параметр
    push bp
    mov bp, sp
    push str2
    call Len            ; определяем длину подстроки (результат в cx)
    mov len0, cl
    push str1
    call Len            ; определяем длину строки (результат в cx)
    mov len1, cl
    mov found, 0
    sub cl, len0
    inc cl
    mov si, str1
    mov di, str2
    @InStr1_m1:
        push cx
        push si
        push di
        mov cl, len0
        repe cmpsb
        jne @InStr1_m2
        mov found, 1
        @InStr1_m2:
        pop di
        pop si
        pop cx
        inc si
        cmp found, 1
        je @InStr1_m1_end
    loop @InStr1_m1
    @InStr1_m1_end:
    xor ax, ax
    cmp found, 1
    jne @InStr1_m3
    mov ax, si
    sub ax, str1
    @InStr1_m3:
    pop bp
    ret 4
InStr1 endp
 
Len proc
    str1 equ [bp+4]
    push bp
    mov bp, sp
    mov si, str1
    xor cx, cx
    @Len_m1:
        lodsb
        test al, al
        jz @Len_m1_end
        inc cx
    jmp @Len_m1
    @Len_m1_end:
    pop bp
    ret 2
Len endp
end start
0
1 / 1 / 0
Регистрация: 15.12.2010
Сообщений: 21
21.06.2012, 18:16  [ТС]
DarkVeiL, благодарю
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
21.06.2012, 23:03
Будет из чего выбрать.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;TASM, COM - файл
;tasm.exe /m
;tlink.exe /t /x
;
.model tiny
.code
.386
org 100h
start:
;Подсчет символов в строке с коррекцией регистра DI после строковых команд
    lea di,S
    mov si,di   ;si потом понадобится для ввода первого символа подстроки
    mov dx,di   ;сохранить адрес строки
push di
    call Len    ;подсчет
    mov [LenS],di   ;результат
;Подсчет подстроки
    lea di,So
    mov si,di
    call Len
    dec di      ;еще одна коррекция после lodsb
    mov [LenSo],di
 
    lodsb       ;читать первый символ из подстроки в AL (si)
    mov bx,si   ;адес второго символа будет нужен для сравнения строк
pop di          ;адрес строки
m1:
    mov si,bx
    mov cx,[LenS]
    repne scasb ;искать первый символ из AL в строке (di)
    jnz short exit
 
    mov [LenS],cx   ;остаток символов в строке
    mov cx,[LenSo]  ;число символов в подстроке
    repe cmpsb  ;сравнить подстроку со строкой (SI и DI)
    jnz short m1    ;нет совпадений
    sub di,dx   ;совпало, разница начала строки и конец
    sub di,[LenSo]  ;и еще минус подстрока
    mov ax,di   ;индекс в строке
 
;Преобразование и вывод на экран
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
 
exit:
    mov ah,0
    int 16h
 
    ret
;------------------
Len proc    near
    mov al,0    ;искать 0
    mov bx,di   ;сохранить начальный адрес строки
    mov cx,-1   ;максимально возможная длина строки 0FFFFh
    repne scasb ;искать
    sub di,bx   ;разница адресов между началом строки и
            ;найденым 0 = длина строки + 1
    dec di      ;DI=DI-1=длина строки
    ret
Len endp
;------------------- 
S       db     '123456789opata*opa',0    ;основная строка
So      db     'opa',0           ; подстрока
LenS    dw  ?
LenSo   dw  ?
 
    end start
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
22.06.2012, 07:19
посмотри здесь
0
0 / 0 / 0
Регистрация: 14.10.2015
Сообщений: 3
05.01.2016, 13:10
AFP, Mikl___, почему не работает этот код (код пользователя AFP):
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;TASM, COM - файл
;tasm.exe /m
;tlink.exe /t /x
;
.model tiny
.code
.386
org 100h
start:
;Подсчет символов в строке с коррекцией регистра DI после строковых команд
    lea di,S
    mov si,di   ;si потом понадобится для ввода первого символа подстроки
    mov dx,di   ;сохранить адрес строки
push di
    call Len    ;подсчет
    mov [LenS],di   ;результат
;Подсчет подстроки
    lea di,So
    mov si,di
    call Len
    dec di      ;еще одна коррекция после lodsb
    mov [LenSo],di
 
    lodsb       ;читать первый символ из подстроки в AL (si)
    mov bx,si   ;адес второго символа будет нужен для сравнения строк
pop di          ;адрес строки
m1:
    mov si,bx
    mov cx,[LenS]
    repne scasb ;искать первый символ из AL в строке (di)
    jnz short exit
 
    mov [LenS],cx   ;остаток символов в строке
    mov cx,[LenSo]  ;число символов в подстроке
    repe cmpsb  ;сравнить подстроку со строкой (SI и DI)
    jnz short m1    ;нет совпадений
    sub di,dx   ;совпало, разница начала строки и конец
    sub di,[LenSo]  ;и еще минус подстрока
    mov ax,di   ;индекс в строке
 
;Преобразование и вывод на экран
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
 
exit:
    mov ah,0
    int 16h
 
    ret
;------------------
Len proc    near
    mov al,0    ;искать 0
    mov bx,di   ;сохранить начальный адрес строки
    mov cx,-1   ;максимально возможная длина строки 0FFFFh
    repne scasb ;искать
    sub di,bx   ;разница адресов между началом строки и
            ;найденым 0 = длина строки + 1
    dec di      ;DI=DI-1=длина строки
    ret
Len endp
;------------------- 
S       db     '123456789opata*opa',0    ;основная строка
So      db     'opa',0           ; подстрока
LenS    dw  ?
LenSo   dw  ?
 
    end start
Выдает пустое окно и при нажатии на какую либо клавишу выдает ошибку.
Миниатюры
Поиск подстроки в строке  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2016, 13:10
Помогаю со студенческими работами здесь

Поиск подстроки в строке
Ассемблер, робота со строками. Ребята, нашел исходник проги, находящей подстроку в строке, но не пашет В чем проблема - не понимаю. ...

Поиск подстроки в строке
собственно есть строка program assembler есть слово assembler найти слово assembler, при этом сканируя каждый символ в строке со...

Поиск подстроки в строке
Доброго времени суток, помогите! Написать программу, определяющую номер позиции, с которой начинается первое слева вхождение...

Поиск подстроки в строке
Доброго всем времени суток!!!Требуется решить следующую задачу. Ввести с клавиатуры две строки. Сравнить их. Если вторая строка...

[masm32] Поиск подстроки в строке
"В заданной строке с нулевым завершителем определить позицию заданной подстроки." Помогите с кодом, пожалуйста. Дело в том, что я...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru