Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
1

Подсчёт количества повторений символов в строке

11.12.2012, 13:28. Просмотров 1196. Ответов 17
Метки нет (Все метки)

Подскажите , почему не работает код? Ввожу строку , ввожу символ, проверяю сколько раз он встречается в строке. Но встречается он всегда 0 раз.

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
CSEG segment
 
org 100h 
 
begin:
            
lea dx,sin
mov ah,9
int 21h
 
;Ввод строки
 
lea dx,buf
mov ah,0ah
int 21h
 
 
lea dx,mess2
mov ah,9
int 21h
 
 
;Ввод символа
lea dx,s2
mov ah,0ah
int 21h
 
 
call cik1
xor ax,ax
mov ah,9
int 21h
;-------------------------------------
 
mov al,buf
mov ah,s2
 
cik1:
cmp al,'$'
je exit
cmp al,ah
je found
inc al
jmp cik1
;-------------------------------
 
found:
inc bl
inc al
jmp cik1
;----------------------
 
exit:
mov count,bl
mov ah,9
lea dx,find
int 21h
 
mov dl,count
add dl,30h
mov ah,02h
int 21h
;----------------------------
 
push ax
mov ah,10h
int 16h
pop ax
 
int 20h                     
 
 
sin             db 0Dh,0Ah,'Enter string: $ ',0Dh,0Ah   
buf     db 128 dup('$')
mess2 db  0dh,0ah,"Vveditesumvol",0dh,0ah,"$"
s2 db 128 dup('$')              
count db  ?
find  db  0ah,0dh,'Simbol find:  $'
 
CSEG ends
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 13:28
Ответы с готовыми решениями:

Подсчет количества разных символов в строке
доброго времени суток нужно написать такую программу : "подсчет...

Подсчёт количества букв "a" в файле и вывод на экран [tasm]
Вот что-то написал. Не запускается. .486 model small Data SEGMENT use16...

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

Количество символов в строке
вводится строка с клавиатуры, каждый элемент меняестя на следующий по алфавиту,...

Сортировка символов в строке по алфавиту
не могу найти ошибку.теоретически всё правильно работает.но вот на деле походу...

17
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 16:06 2
это что за бред вообще??? это не прога, а простой набор операторов
0
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 16:17  [ТС] 3
И что здесь не так?
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 16:26 4
да тут все не так. начну:
Цитата Сообщение от Sawyer1988 Посмотреть сообщение
Assembler
1
call cik1
зачем вы вызываете цикл, если вы еще ничего не подготовили для его вызова???
Цитата Сообщение от Sawyer1988;3838343[ASM
]xor ax,ax
mov ah,9
int 21h[/ASM]
зачем повторно выводить символ??

Цитата Сообщение от Sawyer1988 Посмотреть сообщение
Assembler
1
inc al
нахрена?? тут по идее должено быть увеличено смещение относительно начала буфера с текстом

Цитата Сообщение от Sawyer1988 Посмотреть сообщение
Assembler
1
mov al,buf
в аl будет 128, а не символ
Цитата Сообщение от Sawyer1988 Посмотреть сообщение
Assembler
1
mov ah,s2
тоже самое что и в al
Цитата Сообщение от Sawyer1988 Посмотреть сообщение
Assembler
1
count db *?
зачем тут эта переменная??? она лишняя.

Добавлено через 48 секунд
Цитата Сообщение от Fatal Error Посмотреть сообщение
зачем вы вызываете цикл,
да и вообще, зачем тут процедурка, елси можно все без нее делать?
1
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 16:44  [ТС] 5
Вот я и смотрю, что что-то не работает)

Добавлено через 14 минут
Но правильно реализовать всё равно не получается)
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
CSEG segment
 
org 100h 
 
begin:
            
lea dx,sin
mov ah,9
int 21h
 
 
lea dx,buf
mov ah,0ah
int 21h
 
lea dx,mess2
mov ah,9
int 21h
;----------------------
 
;Ввод символа
lea dx,s2
mov ah,0ah
int 21h
 
mov al,buf
mov ah,s2
 
cik1:
cmp al,'$'
je exit
cmp al,ah
je found
inc al
jmp cik1
;-------------------------------
 
found:
inc bl
inc al
jmp cik1
;----------------------
 
exit:
 
mov ah,9
lea dx,find
int 21h
 
mov ah,2h
add dl,30h
int 21h
;----------------------------
 
push ax
mov ah,10h
int 16h
pop ax
 
 
int 20h                     
    
sin             db 0Dh,0Ah,'Enter string: $ ',0Dh,0Ah   
buf db 128 dup('$')
mess2 db  0dh,0ah,"Vveditesumvol",0dh,0ah,"$"
 
s2 db 2('$')            
find  db  0ah,0dh,'Simbol find:  $'
 
CSEG ends                   
end begin
0
AFP
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
11.12.2012, 17:01 6
Вот в вашем стиле:
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
;call cik1
;xor ax,ax
;mov ah,9
;int 21h
;-------------------------------------
lea si,buf+2    ;введенная строка начинается с 3 позиции
mov ah,[s2+2]   ;введенная строка начинается с 3 позиции
 
cik1:
mov al,[si]
;cmp al,'$'
cmp al,0Dh  ;последний символ будет 0Dh - Enter
je exit
cmp al,ah
je found
;inc al
inc si
jmp cik1
;-------------------------------
 
found:
inc bl
;inc al
inc si
jmp cik1
;----------------------
 
exit:
;mov count,bl
mov ah,9
lea dx,find
int 21h
 
;mov dl,count
mov dl,bl
 
add dl,30h
mov ah,02h
int 21h
;----------------------------
 
;push ax    ;лишнее
mov ah,10h
int 16h
;pop ax     ;лишнее
1
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 17:16  [ТС] 7
А как в асме можно задать строку большей длины ?
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 17:25 8
Sawyer1988, курите справочник прерываний
1
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 17:29  [ТС] 9
Только принялся за асм)
Последний вопрос по теме - как можно организовать цикл подсчёта количества повторов каждого элемента в строке,
без ввода эл-тов с клавиатуры. У меня он проверяет только первый элемент:
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
...
begin:
            
lea dx,sin
mov ah,9
int 21h
 
 
lea dx,buf
mov ah,0ah
int 21h
 
;-------------------------------------
lea si,buf+2 
mov ah,[buf+2]   
 
cik1:
mov al,[si]
cmp al,0Dh  
je exit
cmp al,ah
je found
inc si
jmp cik1
 
found:
inc bl
inc si
jmp cik1
;---------------------- 
exit:
mov ah,9
lea dx,find
int 21h 
 
mov dl,bl
 
add dl,30h
mov ah,02h
int 21h
;----------------------------
 
mov ah,10h
int 16h
int 20h     
...
0
Mikl___
Автор FAQ
11795 / 6098 / 556
Регистрация: 11.11.2010
Сообщений: 11,091
11.12.2012, 17:37 10
Цитата Сообщение от Sawyer1988 Посмотреть сообщение
как можно организовать цикл подсчёта количества повторов каждого элемента в строке,
можно было и поиск на форуме использовать -- посмотри здесь
1
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 17:51 11
Цитата Сообщение от Mikl___ Посмотреть сообщение
как можно организовать цикл подсчёта количества повторов каждого элемента в строке,
есть в асме циклы, и зовут их loop'ы. и делают иэти лопы следующее:
Assembler
1
2
3
mov cx, сколько_раз_надо_выполнить_цикл
@@:;тут делаем что нужно
loop @@   ;прыжок на метку, пока сх не равен нулю
1
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 18:08  [ТС] 12
Посмотрел примеры по циклам , но непонятно, почему не перебирается вся строка :
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
mov cx,5
M1:
lea si,buf+2 
mov ah,[s2+2]    
cik1:
mov al,[si]
cmp al,0Dh  
je exit
cmp al,ah
je found
inc si
jmp cik1
 
found:
inc bl
 
inc si
jmp cik1
;----------------------
 
exit:
mov ah,9
lea dx,find
int 21h
 
 
mov dl,bl
 
add dl,30h
mov ah,02h
int 21h
Loop M1
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 18:47 13
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mov cx,buf[1]
lea si,buf+2 
mov ah,[s2+2]
M1:
mov al,[si]
cmp al,0Dh  
je exit
cmp al,ah
je found
_loop:
inc si
loop M1
 
found:
inc bl
jmp short _loop
0
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 18:56  [ТС] 14
mov cx,buf[1] пишет invalid instruction operands
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 19:08 15
Цитата Сообщение от Sawyer1988 Посмотреть сообщение
mov cx,buf[1]
пардон, делайте cl
Assembler
1
mov cl,buf[1]
1
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
11.12.2012, 19:23  [ТС] 16
цикл ,который вы привели выше работает, но запустив прогу не совсем понятно что он делает=)(мой последний вопрос заключался в выводе на экран количества повторов каждого символа в введённой с клавиатуры строки)
Делаю так:

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
CSEG segment
 
org 100h 
 
begin:
            
lea dx,sin
mov ah,9
int 21h
  
lea dx,buf
mov ah,0ah
int 21h
 
lea dx,mess2
mov ah,9
int 21h
;----------------------
 
mov cl,buf[1]
lea si,buf+2 
mov ah,[s2+2]    
M1:
mov al,[si]
cmp al,0Dh  
je exit
cmp al,ah
je found
_loop:
inc si
loop M1
 
found:
inc bl
jmp   short _loop
 
;----------------------
 
exit:
mov ah,9
lea dx,find
int 21h
 
mov dl,bl
 
add dl,30h
mov ah,02h
int 21h
 
;----------------------------
 
mov ah,10h
int 16h
int 20h     
    
sin             db 0Dh,0Ah,'Enter string: $ ',0Dh,0Ah  
mess2 db  0dh,0ah,"Vveditesumvol",0dh,0ah,"$"
 
buf db 128 dup('$')         
find  db  0ah,0dh,'Simbol find:  $'
 
CSEG ends                   
end begin
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
11.12.2012, 19:47 17
данный способ сработает если число повторов <10. для больших чисел используйте процедуру для вывода чисел
0
Sawyer1988
10 / 10 / 2
Регистрация: 04.03.2012
Сообщений: 128
12.12.2012, 23:59  [ТС] 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
CSEG segment
 
org 100h 
 
begin:
            
lea dx,sin
mov ah,9
int 21h
  
lea dx,buf
mov ah,0ah
int 21h
 
lea dx,mess2
mov ah,9
int 21h
;----------------------
 
mov cl,buf[1]
lea si,buf+2 
mov ah,[s2+2]    
M1:
mov al,[si]
cmp al,0Dh  
je exit
cmp al,ah
je found
_loop:
inc si
loop M1
 
found:
inc bl
jmp   short _loop
 
;----------------------
 
exit:
mov ah,9
lea dx,find
int 21h
 
mov dl,bl
 
add dl,30h
mov ah,02h
int 21h
 
;----------------------------
 
mov ah,10h
int 16h
int 20h     
    
sin             db 0Dh,0Ah,'Enter string: $ ',0Dh,0Ah  
mess2 db  0dh,0ah,"Vveditesumvol",0dh,0ah,"$"
 
buf db 128 dup('$')         
find  db  0ah,0dh,'Simbol find:  $'
 
CSEG ends                   
end begin
0
12.12.2012, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2012, 23:59

Удаление одинаковых символов в строке
В общем задача такая. Необходимо создать программу, которая вводит цифры в...

Определить количество символов в строке
Я в ассемблере новичек, собственно, интересует вопрос как выглядит код...

Подсчет символов в заданной символьной строке
Помогите, пожалуйста написать программу(TASM): Задана символьная строка,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru