7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
1
TASM

Операции в строке: поиск, замена, удаление символа в строке

27.04.2018, 14:54. Показов 5231. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго здравия!
В ассемблере совсем новичок, поэтому прошу помощи.
Программа должна получать строку с клавиатуры, получать символ, который будет искаться в строке, удалять или заменять
этот символ на другой, введенный пользователем. Причем поиск, замена и удаление должны находится в отдельных процедурах.

Ошибки в строках 22,42,48,49,58.
Помогите исправить пожалуйста!
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
.model small
.stack 256
.data
s1 db 'This programm can find/delete/replace one cymbol',0ah,0dh,'$'
s2 db 'Enter string',0ah,0dh,'$'
s3 db 'Enter replasing symbol',0ah,0dh,'$'
s4 db 'Choose method 1-delete, 2-replace',0ah,0dh,'$'
s5 db 'Result',0ah,0dh,'$'
 
text db 20,?,20 dup(?)
subtext db 3,?,3 dup(?)
subsubtext db 3,?,3 dup(?)
choise db 3,?,3 dup(?)
a1 db ?
.code
 
poisk proc near ; Поиск символа в строке справа налево
mov cl,text+1   ; Записываем длину строки в которой будем искать
mov bh,subtext+2; Записываем символ для сравнения
fcycl:
mov bl,cl
cmp text[bl],bh ;Сравниваем адские коды если символы совпадают, то выходим из цикла
    je poiskend 
    jcxz exit   ;Если нет, то все круто, на выход!
loop fcycl
 
poiskend:
jmp choising    ;Аккуратно выходим из процедуры
ret
poisk endp
 
zamena proc near;Спрашиваем на какой символ хотим заменить и меняем
lea dx,s3       
mov ah,09h
int 21h
 
mov ah,0ah
lea dx,subsubtext
int 21h
 
mov bh,subsubtext+2 ;Узнаем адский код символа для перезаписи
mov text[bl],bh     ;Перезаписываем символ
 
ret
zamena endp
 
udalenie proc near  ;Тут удаляем символБ перезаписыванием на его место следующего и так до конца
mov si,cl           ;Доп регистры от сl
mov di,cl+1
 
scycl:              ;Цикл для перезаписи
 
cmp si, 2           ;Не перезапишем ли технические данные у строки?
jge udalaem
jl udalenieend
 
udalaem:            ;Если не перезапишем, то действуем
mov text[si],text[di] ;Перезапись следующего в предыдущий
dec si                  ; И так до конца
dec di
loop scycl
 
udalenieend:
ret
udalenie endp
 
start:
mov ax,@data
mov ds,ax
 
lea dx,s1
mov ah,09h  ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,text ;Ввод строки
int 21h
 
mov dl,0ah
mov ah,02h  
int 21h
 
mov dl,0dh
mov ah,02h  
int 21h
 
lea dx,s2
mov ah,09h;     Вывод строки
int 21h
 
mov ah,0ah
lea dx,subtext; Ввод строки(с символом)
int 21h
 
firstcall:
call poisk      ;Вызов процедуры поиска
choising:       ;Метка выбора
 
lea dx,s4
mov ah,09h      ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,choise   ;Ввод выбора
int 21h
 
cmp choise[2],'1' ;Проверка выбора
    je udal
    jne zam
    jg choising
    
udal:           ;Вызов процедуры удаления
call udalenie
jmp firstcall
 
zam:            ;Вызов процедуры замены
call zamena
jmp firstcall
    
exit:           ;Выход
lea dx,s5
mov ah,09h
int 21h
 
mov cl,text+1   ;Увеличиваем строку на 1, чтобы записать символ конца строки
inc cl
 
xor ch,ch
mov si,cx
 
mov text[si+1],24h ;Записываем символ конца строки
 
lea dx,text         ;Вывод
add dx,2
mov ah,09h
int 21h
 
mov ax,4c00h
int 21h
end start
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2018, 14:54
Ответы с готовыми решениями:

Нахождение, замена и удаление символа в строке
В памяти находится строка символов по адресу А1 и длиной N. Проверьте, встречается ли в строке...

Поиск символа в строке и замена
В общем такое задание: дана страка символов, допустим "asdfjklrtldfl" дан символ "l" допустим. И...

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

Замена символа в строке на число соответствующему номеру по порядку вхождения этого символа в строку
В заданной строке заменить каждый символ «*» числом, соответствующим номеру по порядку вхождения...

18
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,262
27.04.2018, 15:49 2
Цитата Сообщение от Battary Посмотреть сообщение
строках 22,42
В x86 нет режима индексации через [bl], а в 8086 вообще только через bx/bp/si/di.
Цитата Сообщение от Battary Посмотреть сообщение
48,49
Размеры регистров si и cl различны, нельзя переместить один в другой.
Цитата Сообщение от Battary Посмотреть сообщение
58
Оба операнда одной инструкции (за исключением push/pop) не могут находиться в памяти.
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
27.04.2018, 16:15  [ТС] 3
А как мне тогда сделать удаление? Вообще не понимаю, регистры то не бесконечные.
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,262
27.04.2018, 16:48 4
Battary, так же, как у вас и было. Можно задействовать MOVSB. Правда, для LOOP надо в CX заносить количество итераций цикла, а у вас там ничего не заносится.
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
27.04.2018, 18:35  [ТС] 5
А я использую cl еще из поиска

Добавлено через 1 час 18 минут
В 8086 почему нельзя использовать bl?
С википедии: Всего в процессоре Intel 8086 имеется 16 16-разрядных регистров: 8 регистров общего назначения (AX, BX, CX, DX), 2 индексных регистра (SI, DI), 2 указательных (BP, SP), 4 сегментных регистра (CS, SS, DS, ES), программный счётчик или указатель команды (IP) и регистр флагов (FLAGS, включает в себя 9 флагов). При этом регистры данных (AX, BX, CX, DX) допускают адресацию не только целых регистров, но и их младшей половины (регистры AL, BL, CL, DL) и старшей половины (регистры AH, BH, CH, DH)
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
27.04.2018, 18:56  [ТС] 6
Приветствую!
Программа должна получать строку с клавиатуры, получать символ, который будет искаться в строке, удалять или заменять
этот символ на другой, введенный пользователем. Причем поиск, замена и удаление должны находится в отдельных процедурах.
Но ошибки:
27,44,45,62-illegal indexing mode
35-illegal use of const
Исправьте пожалуйста, подскажите, какие я должен использовать регистры, чтобы все работало?
(И почему они вообще не работают, регистры по 1 байт, но вот)
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
.model small
.stack 256
.data
s1 db 'This programm can find/delete/replace one cymbol',0ah,0dh,'$'
s2 db 'Enter string',0ah,0dh,'$'
s3 db 'Enter replasing symbol',0ah,0dh,'$'
s4 db 'Choose method 1-delete, 2-replace',0ah,0dh,'$'
s5 db 'Result',0ah,0dh,'$'
 
text db 20,?,20 dup(?)
subtext db 3,?,3 dup(?)
subsubtext db 3,?,3 dup(?)
choise db 3,?,3 dup(?)
a1 db ?
.code
 
zamena proc near;Спрашиваем на какой символ хотим заменить и меняем
lea dx,s3       
mov ah,09h
int 21h
 
mov ah,0ah
lea dx,subsubtext
int 21h
 
mov bh,subsubtext+2 ;Узнаем адский код символа для перезаписи
mov text[bl],bh     ;Перезаписываем символ
 
ret
zamena endp
 
udalenie proc near  ;Тут удаляем символБ перезаписыванием на его место следующего и так до конца
push ax
mov ah,cl           ;Доп регистры от сl
mov al,cl+1
 
scycl:              ;Цикл для перезаписи
 
cmp ah, 2           ;Не перезапишем ли технические данные у строки?
jge udalaem
jl udalenieend
 
udalaem:;Если не перезапишем, то действуем
mov bh,text[ah]
mov bl,text[al]
mov bh,bl ;Перезапись следующего в предыдущий
dec ah                  ; И так до конца
dec al
loop scycl
 
udalenieend:
pop ax
ret
udalenie endp
 
poisk proc near ; Поиск символа в строке справа налево
push ax
mov cl,text+1   ; Записываем длину строки в которой будем искать
mov al,subtext+2; Записываем символ для сравнения
fcycl:
mov ah,cl
cmp text[al],ah ;Сравниваем адские коды если символы совпадают, то переходим к выбору
    je poiskend 
    jcxz exit   ;Если нет, то все круто!
loop fcycl
 
poiskend:
pop ax
jmp choising    ;Аккуратно выходим из процедуры
ret
poisk endp
 
start:
mov ax,@data
mov ds,ax
 
lea dx,s1
mov ah,09h  ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,text ;Ввод строки
int 21h
 
mov dl,0ah
mov ah,02h  
int 21h
 
mov dl,0dh
mov ah,02h  
int 21h
 
lea dx,s2
mov ah,09h;     Вывод строки
int 21h
 
mov ah,0ah
lea dx,subtext; Ввод строки(с символом)
int 21h
 
firstcall:
call poisk      ;Вызов процедуры поиска
choising:       ;Метка выбора
 
lea dx,s4
mov ah,09h      ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,choise   ;Ввод выбора
int 21h
 
cmp choise[2],'1' ;Проверка выбора
    je udal
    jne zam
    jg choising
    
udal:           ;Вызов процедуры удаления
call udalenie
jmp firstcall
 
zam:            ;Вызов процедуры замены
call zamena
jmp firstcall
    
exit:           ;Выход
lea dx,s5
mov ah,09h
int 21h
 
mov cl,text+1   ;Увеличиваем строку на 1, чтобы записать символ конца строки
inc cl
 
xor ch,ch
mov si,cx
 
mov text[si+1],24h ;Записываем символ конца строки
 
lea dx,text         ;Вывод
add dx,2
mov ah,09h
int 21h
 
mov ax,4c00h
int 21h
end start
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
27.04.2018, 19:25 7
Цитата Сообщение от Battary Посмотреть сообщение
В 8086 почему нельзя использовать bl?
Имеется ввиду, что нельзя его использовать именно для индексации, как и любой другой 8битный регистр, только целиком все 16 бит, ибо адреса 16 битные. Тут действует правило того, что нельзя складывать числа разной разрядности (адресс 16 бит + регистр 16 бит = конечный адрес)
Цитата Сообщение от Battary Посмотреть сообщение
При этом регистры данных (AX, BX, CX, DX) допускают адресацию не только целых регистров, но и их младшей половины (регистры AL, BL, CL, DL) и старшей половины (регистры AH, BH, CH, DH)
Тут имеется ввиду то, что можно их использовать, например для арифметики, но использовать их для адресации переменных не выйдет.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
27.04.2018, 20:56 8
Battary, синтаксис вида mov bl,text[al] вводит в заблуждение сходством с массивами на некоторых языках высокого уровня.
Но в ассемблере по отношению к работе с памятью вы остаётесь без этих абстакций (массив, индекс массива). Всё, с чем может работать процессор - адреса памяти (не индексы). При этом нет автоматического приведения переменных меньшего размера к переменным большего размера.
В DOS (под которую набрана программа) адресация реализована 16-разрядными регистрами и адресами внутри одного сегмента. Кроме того, для косвенной адресации в старых режимах процессора (i8086) подходят лишь 4 регистра (их перечисляли выше).
Таким образом, получается что нужно полностью переписывать программу - перераспределив роли регистров.
И в новой программе приведённая ранее строка могла бы выглядеть mov bl,text[si]. Но для этого нужно полностью перераспределить содержимое регистров.
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
28.04.2018, 14:38  [ТС] 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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
.model small
.stack 256
.data
s1 db 'This programm can find/delete/replace one cymbol, Enter string',0ah,0dh,'$'
s2 db 'Enter symbol',0ah,0dh,'$'
s3 db 'Enter replasing symbol',0ah,0dh,'$'
s4 db 'Choose method 1-delete, 2-replace',0ah,0dh,'$'
s5 db 'Result',0ah,0dh,'$'
 
text db 20,?,20 dup(?)
subtext db 2,?,2 dup(?)
subsubtext db 2,?,2 dup(?)
choise db 2,?,2 dup(?)
d db 0
e db 0 
q dw 0
.code
 
zamena proc near;Спрашиваем на какой символ хотим заменить и меняем
lea dx,s3       
mov ah,09h
int 21h
 
mov ah,0ah
lea dx,subsubtext
int 21h
 
xor bh,bh 
;mov si, bx
mov bh,subsubtext+2 ;Узнаем адский код символа для перезаписи
mov text[si],bh ;Перезаписываем символ
 
ret
zamena endp
 
udalenie proc near  ;Тут удаляем символ перезаписыванием на его место следующего и так до конца
push ax
mov ah,cl           ;Доп регистры от сl
 
;inc cl             
inc cl
mov al,cl
dec cl
 
scycl:              ;Цикл для перезаписи
 
cmp ah, 2           ;Не перезапишем ли технические данные у строки?
jge udalaem
jl udalenieend
 
udalaem:    ;Если не перезапишем, то действуем
 
mov d, al
mov e, ah
mov q, ax
 
xor al, al
mov si, ax
mov bh,text[si]
 
xor ax,ax
mov ax, q
 
xor ah,ah
mov si, ax
mov bl, text[si]
 
mov al, d
mov ah, e
 
mov bh,bl ;Перезапись следующего в предыдущий
dec ah                  ; И так до конца
dec al
loop scycl
 
udalenieend:
pop ax
ret
udalenie endp
 
poisk proc near ; Поиск символа в строке справа налево
push ax
xor ax,ax
mov cl,text+1   ; Записываем длину строки в которой будем искать
mov al,subtext+2; Записываем символ для сравнения
fcycl:
mov si, cx
cmp text[si],al ;Сравниваем адские коды если символы совпадают, то переходим к выбору
    je poiskend 
    jcxz exit   ;Если нет, то все круто!
loop fcycl
 
poiskend:
pop ax
jmp choising    ;Аккуратно выходим из процедуры
ret
poisk endp
 
start:
mov ax,@data
mov ds,ax
 
lea dx,s1
mov ah,09h  ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,text ;Ввод строки
int 21h
 
mov dl,0ah
mov ah,02h  
int 21h
 
mov dl,0dh
mov ah,02h  
int 21h
 
lea dx,s2
mov ah,09h;     Вывод строки
int 21h
 
mov ah,0ah
lea dx,subtext; Ввод строки(с символом)
int 21h
 
firstcall:
call poisk      ;Вызов процедуры поиска
choising:       ;Метка выбора
 
lea dx,s4
mov ah,09h      ;Вывод строки
int 21h
 
mov ah,0ah
lea dx,choise   ;Ввод выбора
int 21h
 
cmp choise[2],'1' ;Проверка выбора
    je udal
    jne zam
    jg choising
    
udal:           ;Вызов процедуры удаления
call udalenie
jmp firstcall
 
zam:            ;Вызов процедуры замены
call zamena
jmp firstcall
    
exit:           ;Выход
pop ax ;Если перешли с поиска
 
lea dx,s5
mov ah,09h
int 21h
 
mov cl,text+1   ;Увеличиваем строку на 1, чтобы записать символ конца строки
inc cl
 
xor ch,ch
mov si,cx
 
mov text[si+1],24h ;Записываем символ конца строки
 
lea dx,text         ;Вывод
add dx,2
mov ah,09h
int 21h
 
mov ax,4c00h
int 21h
end start
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,262
28.04.2018, 14:46 10
Цитата Сообщение от Battary Посмотреть сообщение
не могу понять почему
А вы никогда не слышали о существовании отладчика, например Turbo debugger? Или, ещё лучше - эмулятора Emu8086?
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
28.04.2018, 15:45  [ТС] 11
Нет, первый раз слышу, пользуюсь только стандартным компилятором. А что это за программы?
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,262
28.04.2018, 15:57 12
Цитата Сообщение от Battary Посмотреть сообщение
А что это за программы?
Ну гугл поможет это узнать. А сами эти программы навсегда решат проблемы типа "почему зависает?".
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
28.04.2018, 15:58 13
Цитата Сообщение от Battary Посмотреть сообщение
Нет, первый раз слышу, пользуюсь только стандартным компилятором. А что это за программы?
В отладчике можно проследить как выполняется программа непосредственно в данный момент, отследить состояние регистров в конкретный момент выполнения и всякое такое. Без таких программ программирование на любом языке не получится
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
28.04.2018, 16:00 14
Цитата Сообщение от Battary Посмотреть сообщение
А что это за программы?
палочка-выручалочка в трудные моменты жизни..
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
28.04.2018, 17:54 15
Лучший ответ Сообщение было отмечено Battary как решение

Решение

Battary, после выполнения замены или удаления выполняется переход на метку firstcall (строки 146 и 150). Т.е. завершение программы не предусмотрено.

Ну и где-то в процедуре замены или удаления зависает после нескольких повторных вызовов.

Инструкция loop работает в 16 разрядном режиме ИСКЛЮЧИТЕЛЬНО с регистром CX, а не CL.

Жуткое отсутствие структурированности - из процедуры poisk переход к метке exit с игнорированием стека. Подозреваю, что где-то вы ещё нарушаете баланс в стеке и завершаете процедуру инструкцией ret - передаёте управление в случайное место в памяти.

Добавлено через 5 минут
Ещё. Совсем необязательно выполнять поиск и перемещение в цикле. Существуют инструкции и префиксы для групповой обработки символов.
Посмотрите https://www.cyberforum.ru/post5516354.html

Также очень рекомендую автоформаттер - http://ato.su/asmtidy/ только он добавляет одну строку рекламы - удалите её.

Добавлено через 53 минуты
Так будет видна и структура и алгоритм программы.
Зачем там нужен поиск - разберётесь самостоятельно и по аналогии выполните.

Добавлено через 41 секунду
И комментариев добавите.
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
; ASM Tidy ver 0.5, (C) Vsevolod Lutovinov klopp@yandex.ru
.model small
.stack 256
.data
s1 db 'This programm can find/delete/replace one cymbol, Enter string',0ah,0dh,'$'
s2 db 'Enter find symbol',0ah,0dh,'$'
s3 db 'Enter replacing symbol',0ah,0dh,'$'
s4 db 'Choose method 0-exit, 1-delete, 2-replace',0ah,0dh,'$'
s5 db 'Result',0ah,0dh,'$'
 
CrLf db 0Dh, 0Ah, '$'
 
text db 20,?,20 dup(?)
subtext db 2,?,2 dup(?)
subsubtext db 2,?,2 dup(?)
choise db 2,?,2 dup(?)
d db 0
e db 0
q dw 0
.code
 
Replace proc near        ;Спрашиваем на какой символ хотим заменить и меняем
    lea si, text+2
    mov di, si
    xor cx, cx
    mov cl, [text+1]
    @@ReplaceLoop:
        lodsb
        cmp al, [subtext+2]
        jne @@ReplaceNext
        mov al, [subsubtext+2]
        mov [si-1], al
    @@ReplaceNext:
    loop @@ReplaceLoop
 
    ret
Replace endp
 
Delete proc near      ;Тут удаляем символ перезаписыванием на его место следующего и так до конца
    push es
    mov ax, ds
    mov es, ax
 
    lea si, text+2
    mov di, si
    xor cx, cx
    mov cl, [text+1]
    xor bl, bl
    @@DeleteLoop:
        lodsb
        cmp al, [subtext+2]
        je @@DeleteNext
        stosb
        inc bl
    @@DeleteNext:
    loop @@DeleteLoop
    mov [text+1], bl    ;обновить актуальную длину строки
 
    pop es
    ret
Delete endp
 
poisk proc near         ; Поиск символа в строке справа налево
 
    ret
poisk endp
 
ShowResult proc near
    lea dx,s5
    mov ah,09h
    int 21h
 
    mov cl,text+1       ;Увеличиваем строку на 1, чтобы записать символ конца строки
    inc cl
 
    xor ch,ch
    mov si,cx
 
    mov text[si+1],24h  ;Записываем символ конца строки
 
    lea dx,text+2         ;Вывод
    mov ah,09h
    int 21h
 
    mov ah, 09h
    lea dx, [CrLf]
    int 21h
 
    ret
ShowResult endp
 
GetFindChar proc near
    lea dx,s2
    mov ah,09h          ;     Вывод строки
    int 21h
 
    mov ah,0ah
    lea dx,subtext      ; Ввод строки(с символом)
    int 21h
 
    mov ah, 09h
    lea dx, [CrLf]
    int 21h
 
    ret
GetFindChar endp
 
GetReplChar proc near
    lea dx,s3
    mov ah,09h          ;     Вывод строки
    int 21h
 
    mov ah,0ah
    lea dx,subsubtext      ; Ввод строки(с символом)
    int 21h
 
    mov ah, 09h
    lea dx, [CrLf]
    int 21h
 
    ret
GetReplChar endp
 
start:
    mov ax,@data
    mov ds,ax
 
    lea dx,s1
    mov ah,09h          ;Вывод строки
    int 21h
 
    mov ah,0ah
    lea dx,text         ;Ввод строки
    int 21h
 
    mov ah, 09h
    lea dx, [CrLf]
    int 21h
 
firstcall:
    ;call poisk          ;Вызов процедуры поиска
 
 
menu:
    lea dx,s4
    mov ah,09h          ;Вывод строки
    int 21h
choising:
    mov ah,08h
    int 21h
 
testudal:
    cmp al, '1'   ;Проверка выбора
    jne testzam
 
    ;Вызов процедуры удаления
    call GetFindChar    ;получить удаляемый символ
    call Delete         ;удалить его по всей строке
    call ShowResult
    jmp menu
testzam:
    cmp al, '2'
    jne testexit
    ;Вызов процедуры замены
    call GetFindChar    ;получить заменяемый символ
    call GetReplChar    ;получить символ для замены
    call Replace        ;заменить по всей строке
    call ShowResult
    jmp menu
testexit:
    cmp al, '0'
    jne choising
 
exit:
;Выход
 
    mov ax,4c00h
    int 21h
end start
Добавлено через 55 секунд
И первую строку удалите - это реклама от автоформаттера случайно осталась.
0
7 / 6 / 1
Регистрация: 29.10.2016
Сообщений: 175
28.04.2018, 18:40  [ТС] 16
ФедосеевПавел
Но если я считываю размер строки из ячейки в 1байт, то зачем мне использовать весь cx? Если результат все-равно уместится в cl.

Добавлено через 5 минут
Cпасибо большое! Разберу код и буду сравнивать со своим, искать ошибки, так сказать.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
28.04.2018, 19:04 17
Цитата Сообщение от Battary Посмотреть сообщение
Но если я считываю размер строки из ячейки в 1байт, то зачем мне использовать весь cx? Если результат все-равно уместится в cl.
А вы тут совершенно ни при чём. Этого требует разработчик процессора - Intel - для работы с инструкциями loop, rep, jcxz.
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,262
28.04.2018, 19:06 18
Цитата Сообщение от Battary Посмотреть сообщение
то зачем мне использовать весь cx
Старшую часть надо предварительно занулить, потому что там может быть мусор, и вместо допустим 10 раз у вас цикл прокрутится 10000 раз.
0
3 / 3 / 0
Регистрация: 09.11.2016
Сообщений: 88
Записей в блоге: 2
10.05.2018, 05:03 19
Battary,
Не по теме : можно вызвать процедуры udalenie и zamena сразу после cmp. Для этого нужно сохранить адрес следующей инструкции после перехода к процедуры:
Assembler
1
2
3
4
5
push offset exit   ;сохранение следуйщий инструкции в стёке 
cmp bl,'1'
 
je udalenie
jne zamena
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2018, 05:03
Помогаю со студенческими работами здесь

Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить последнее вхождение символа...

Замена символа в строке
Здравствуйте! Есть небольшая проблема, в поле базы храниться строка: (какой-то...

Замена символа в строке
Если кто-то сможет помогите пожалуйста. Дана следующая задачка: Написать программу, которая...

Замена символа в строке
В строке “ 4 * Х * 2 + 3 * Х + У * 7 – 9 = 0 ” все вхождения символа “Х” заменить на заданный...

Замена символа в строке
Всем добрый день. Помогите пожалуйста с кодом ) Есть файл в txt-формате. В нем несколько сотен...

Замена символа (ов) в строке
Пытаюсь заменить в строке str все символы на a перебором по символам .data str db 'Privet1...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru