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

[masm32] Замена символов в строке

06.12.2012, 20:21. Показов 4641. Ответов 5

Author24 — интернет-сервис помощи студентам
Суть программы, заменить один символ на другой. Оба вводятся с консоли. Ну и искомая строка соответственно.
Прошу помочь тк мой код не работает, либо его исправить либо новый. (И просьба без прерываний)

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
.386
    .model flat, stdcall    
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\msvcrt.lib
.data
entr    db  'Enter string(more 2 symbol):',0
entr1   db  'Enter symbol:',0dh,0ah,0
entr2   db  'Enter zamena:',0dh,0ah,0 
tpts    db  '%s',0
res db  'Vivod: %d',0
.data?
pbuf    dd  ?
.code    
start:  
    invoke  crt_malloc, 256
    mov pbuf, eax
    invoke  crt_printf, ADDR entr
    invoke  crt_gets, ADDR pbuf+1
    invoke  crt_strlen, ADDR pbuf+1                         ;gets(&pbuf[1])  EAX=strlen(&pbuf[1])  pbuf[0]=pbuf[EAX]
    or  eax, eax        ; длина строки == 0 ?
    jz  gtfo          ; yeah
    invoke  crt_printf, ADDR entr1
    invoke crt_getchar
    mov ebx, eax
    invoke  crt_printf, ADDR entr2
    invoke crt_getchar
    mov edx, eax
    lea esi, pbuf       ; начало буфера
    mov ecx, eax        ; счётчик
next:   
    cmp [esi], esp
    je zamena
    jnz non_equal
non_equal:
    inc esi
    loop    next
zamena:
    mov esi, edx
 
    ; Вывод
    invoke  crt_printf, ADDR res, esi
        
_exit:  call    crt__getch
gtfo:   invoke  crt_free, ADDR pbuf
    invoke  crt_exit,0
 
    end start
Понимаю, код не самый лучший.
С уважением Александр.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2012, 20:21
Ответы с готовыми решениями:

Masm32 поиск символов в строке
Здравствуйте, написал небольшую программу, которая ищет заданный символ в строке и выдает сообщение...

Замена символов в строке
Здравствуйте. Мне нужно сделать такое задание. //Найти в строке символ o и заменить его символом <...

Замена символов в строке
В общем задача - заменить все точки в двух строках на восклицательные знаки. Пробую это сделать...

Макросы: Замена символов в строке
Помогите, пожалуйста, с задачей. Задача на макросы: Преобразовать строку, заменив все «:» запятыми,...

5
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
06.12.2012, 21:03 2
Цитата Сообщение от Querubin
jz gtfo ; yeah
Угу. а в оригинале-то что было? Перед этой меткой EAX = strlen(pbuf);
Стало быть, длину надобно сохранить в стеке, а не лепить потом в ECX в стр.34 неведомо что.
0
0 / 0 / 0
Регистрация: 25.11.2012
Сообщений: 10
07.12.2012, 11:07  [ТС] 3
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Угу. а в оригинале-то что было? Перед этой меткой EAX = strlen(pbuf);
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
start:  
    invoke  crt_malloc, 256
    mov pbuf, eax
    invoke  crt_printf, ADDR entr
    invoke  crt_gets, ADDR pbuf+1
    invoke  crt_strlen, ADDR pbuf+1                         ;gets(&pbuf[1])  EAX=strlen(&pbuf[1])  pbuf[0]=pbuf[EAX]
 
    or  eax, eax        ; длина строки == 0 ?
    jz  gtfo          ; yeah
    lea esi, pbuf       ; начало буфера
    mov ecx, eax        ; счётчик
    mov bl, [esi+ecx]       ; последний символ
    mov [esi],bl        ; копируем в начало
    mov bl,[esi+ecx-1]
    mov [esi-1],bl
    dec esi
    xor edx, edx        ; счётчик "троиц"
next:   
    inc esi
    mov al, [esi-1]
    cmp al, [esi+1]
    jnz non_equal
    inc edx
non_equal:
    loop    next
; EDX = кол-во "троиц"
    invoke  crt_printf, ADDR res, edx
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Стало быть, длину надобно сохранить в стеке, а не лепить потом в ECX в стр.34 неведомо что.
Согласен полностью в 34 строке полная белеберда, прошу прощения. (Вечером постараюсь исправить и выложу снова)
Собственно про синтаксис я догадывался что ошибки. Меня больше волнует почему когда я запускаю её, он доходит до считывания Zamena и вылетает.
Спасибо за помощь.
0
4174 / 1824 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
07.12.2012, 11:57 4
Пример (заменяет символ '*' на '-')
Assembler
1
2
3
4
5
6
7
mov dl,'-'              ;на что заменяем
mov esi,offset pbuf     ;esi - указатель на буффер
@@:mov     al,'*'       ;что заменяем
   cmpxchg [esi],dl     ;if [esi]=al then [esi]:=dl else al:=[esi]
   inc     esi
   test    al,al        ;если дошли до конца строки - выход
jne @b
0
0 / 0 / 0
Регистрация: 25.11.2012
Сообщений: 10
07.12.2012, 12:25  [ТС] 5
Цитата Сообщение от murderer Посмотреть сообщение
Пример (заменяет символ '*' на '-')
Я видел очень много программ где заменяется один символ на другой. У меня символы должны считываться с консоли.
(Пока что в этом проблема)
0
4174 / 1824 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
07.12.2012, 12:29 6
GetStdHandle
ReadConsoleInput
WriteConsole
0
07.12.2012, 12:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2012, 12:29
Помогаю со студенческими работами здесь

[emu8086] Удаление и замена символов в строке
Распечатать введённую строку, удалив из неё символы, не являющихся буквами и цифрами, и заменив...

Замена символов в строке и математические действия
Всем привет. Нужна срочно помощь, никак не получается написать программу. Задание такое: 1)...

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

Замена символов в строке
В заданной строке, состоящей из символов букв и цифр, заменить символы цифр в следующем порядке...


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

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