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

Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ

06.11.2013, 18:36. Показов 2223. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код. Задание: заменить заданный символ в строке текста на указанный новый символ. Выдает следующую ошибку на строку "find_space_index string1, string2"
1>macro.asm(110): error A2022: instruction operands must be the same size
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\masm.targets(49,5): error MSB3721: выход из команды "ml.exe /c /nologo /Zi /Fo"Debug\macro.obj" /W3 /errorReportrompt /Tamacro.asm" с кодом "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
.686
.model flat, c
 
; макрос нахождения длины строки
 
get_length macro s
    lea esi, [s] ;заносим в esi адрес начала s(смещение в памяти), чтобы работать со строкой
    xor ecx, ecx ;очищаем регистр ecx
L:
    mov bl, byte ptr [esi] ;заносим в bl значение по адресу esi
    cmp bl, 0 ;сравниваем с нулем,т.е. определяем конец строки или пустую строку
    je end_macro ;переходим на метку end_macro, если bl=0
    inc ecx ;увеличиваем ecx на один
    inc esi ;увеличиваем esi
    jmp L;возвращаемся на метку L
end_macro:
    mov len, ecx ;заносим в len длину строки из ecx
endm
 
; макрос нахождения количества пробелов в строке
 
number_of_spaces macro string
    lea esi, [string1]
    mov ecx, len
L4:
    mov bl, byte ptr [esi]
    cmp bl, ' '
    jne L3
    inc num
L3:
    inc esi
    loop L4
Lend:
endm
 
; макрос нахождения индекса пробела в строке
 
find_space_index macro string1, string2
    mov ecx, len
    lea esi, [string1]
    mov eax, 0
    mov edx, [string2]
    mov al, [edx]
    
L1:
    mov bl, byte ptr [esi]
    cmp bl, al 
    je end1
    inc esi
    inc eax
    jmp L1
 
end1:
endm
 
; макрос удаления пробела по его индексу
 
delete_space macro string1, pos
    mov edx, pos
    lea edi, [string1+edx]
    inc edx
    lea esi, [string1+edx]
    
    mov ecx, len
    sub ecx, pos
    inc ecx
L2:
    mov bl, byte ptr [esi]
    mov byte ptr [edi], bl
    inc esi
    inc edi
    loop L2
endm
 
.stack
 
.data
    string1 byte 255 dup(0)
    string2 byte 1 dup(0)
    len dword 0
    num byte 0
    inputmsg1 byte "Enter a string: ", 0
    inputmsg2 byte "Enter a string: ", 0
    outmsg byte "Changed string: %s", 10, 13, 0
    
 
 
 
.code
 
printf proto arg1:ptr byte, printlist: vararg
input proto s:ptr byte
 
; описание функции, которая вызывает макросы
 
f proc 
    invoke printf, addr inputmsg1
    invoke input, addr string1
 
    invoke printf, addr inputmsg2
    invoke input, addr string2
 
    
    get_length string1
    number_of_spaces string1
P:
    cmp num, 0
    je toend
 
    find_space_index string1, string2
    delete_space string1, eax
 
    dec num
    jmp P
 
toend:
    invoke printf, addr outmsg, addr string1
    ret
f endp
 
end
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
extern "C"{
    void f();
}
 
int main() {
    f();
 
    system("pause");
    return 0;
}
 
extern "C"
void input(char s[]) {
    gets(s);
}
Нашла что-то связанное с цифрами 32 бита и 16, но так и не поняла, в чем суть.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2013, 18:36
Ответы с готовыми решениями:

[MASM32] Заменить заданный символ в строке текста на указанный новый символ
Не могу сам сделать, так как мало изучал ассемблер, но очень надо( 4) Напишите диалоговую...

Заменить заданный символ в строке на указанный символ
Ребят, нашел вот такой код, должен заменить заданный символ в строке на указанный символ, а он...

Заменить в каждой строке один заданный символ на другой заданный символ. Описать отдельной функцией замену символов
Следующие ошибки: sym, symChange необъявленные идентификаторы(26, 29; 28, 29 соответсвенно), тип...

Заменить в каждой строке один заданный символ на другой заданный символ
Даны две строки длиной длиной до 80 символов. Заменить в каждой строке один заданный символ на...

4
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
06.11.2013, 20:14 2
Цитата Сообщение от Дев4енка Посмотреть сообщение
Задание: заменить заданный символ в строке текста на указанный новый символ.
Написан полный бред - строка и символы вводятся в сюшной части, в асме нужен только вызов strtok в цикле - строк 15-20 и никаких макросов.
0
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
07.11.2013, 14:48  [ТС] 3
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Написан полный бред - строка и символы вводятся в сюшной части, в асме нужен только вызов strtok в цикле - строк 15-20 и никаких макросов.
так я понимаю что можно и знаю как. но мне надо именно с макросами.задание такое

Добавлено через 17 часов 55 минут
Да, и еще. В проге в комментариях все слова "пробел" надо заменить на "введенный символ". Забыла поменять)
0
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
12.11.2013, 13:52  [ТС] 4
Помогите, пожалуйста.
0
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
20.11.2013, 02:12  [ТС] 5
В общем, подправила чуток. И снова беда. Кстати, компилятор masm
Выдает следующую ошибку при вводе строк(первая-набор произвольных символов, вторая - один символ):
нарушение прав доступа при исполнении по адресу 0x8060FC59
Задание заключается в поиске в первой строке символа из второй и удаление его из первой строки(хотя надо бы реализовать следующее: ввести строку, затем ввести, какой символ надо заменить, а затем ввести, на что будем заменять. Но тут у меня вообще ступор). Предполагаю, что ошибаюсь в работе с esi и edi.
Вот код:
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
.686
.model flat, c
 
; макрос нахождения длины строки
 
get_length macro string1
    lea esi, [string1] ;заносим в esi адрес начала s(смещение в памяти), чтобы работать со строкой
    xor ecx, ecx ;очищаем регистр ecx
L:
    mov bl, byte ptr [esi] ;заносим в bl значение по адресу esi
    cmp bl, 0 ;сравниваем с нулем,т.е. определяем конец строки или пустую строку
    je end_macro ;переходим на метку end_macro, если bl=0
    inc ecx ;увеличиваем ecx на один
    inc esi ;увеличиваем esi
    jmp L;возвращаемся на метку L
end_macro:
    mov len, ecx ;заносим в len длину строки из ecx
endm
 
; макрос нахождения количества символов в строке
 
number_of_spaces macro string1, string2
    lea esi, [string1]
    mov ecx, len
    lea edi, [string2]
    mov al, byte ptr [edi]
L4:
    mov bl, byte ptr [esi]
    cmp bl, al 
    jne L3
    inc num
L3:
    inc esi
    loop L4
Lend:
endm
 
; макрос нахождения индекса пробела в строке
 
find_space_index macro string1, string2
    mov ecx, len
    lea esi, [string1]
    mov eax, 0
    lea edi, [string2]
    mov al, byte ptr [edi]
    
L1:
    mov bl, byte ptr [esi]
    cmp bl, al 
    je end1
    inc esi
    inc eax
    jmp L1
 
end1:
endm
 
; макрос удаления символа по его индексу
 
delete_space macro string1, pos
    mov edx, pos
    lea edi, [string1+edx]
    inc edx
    lea esi, [string1+edx]
    
    mov ecx, len
    sub ecx, pos
    inc ecx
L2:
    mov bl, byte ptr [esi]
    mov byte ptr [edi], bl
    inc esi
    inc edi
    loop L2
endm
 
.stack
 
.data
    string1 byte 255 dup(0)
    string2 byte 1 dup(0)
    len dword 0
    num byte 0
    inputmsg1 byte "Enter a string: ", 0
    inputmsg2 byte "Enter a string: ", 0
    outmsg byte "Changed string: %s", 10, 13, 0
    
 
 
 
.code
 
printf proto arg1:ptr byte, printlist: vararg
input proto s:ptr byte
 
; описание функции, которая вызывает макросы
 
f proc 
    invoke printf, addr inputmsg1
    invoke input, addr string1
 
    invoke printf, addr inputmsg2
    invoke input, addr string2
 
    
    get_length string1
    number_of_spaces string1, string2
P:
    cmp num, 0
    je toend
 
    find_space_index string1, string2
    delete_space string1, eax
 
    dec num
    jmp P
 
toend:
    invoke printf, addr outmsg, addr string1
    ret
f endp
 
end
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
extern "C"{
    void f();
}
 
int main() {
    f();
 
    system("pause");
    return 0;
}
 
extern "C"
void input(char s[]) {
    gets(s);
}
0
20.11.2013, 02:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2013, 02:12
Помогаю со студенческими работами здесь

Поменять в введенном с клавиатуры строке символов подряд заданный символ на другой заданный символ
Поменять в введенном с клавиатуры строке символов подряд заданный символ на другой заданный символ.

Заменить в каждой сроке один заданный символ на другой заданный символ
ПОМОГИТЕ РЕШИТЬ ЗАДАЧУ)) НА ЯЗЫКЕ С!!!!!!! Даны 2 строки до 80 символов. Необходимо Заменить в...

Заменить в каждой строке файла один заданный символ на другой заданный
Добрый день. Товарищи не подскажите как можно заменить символ ; на : чтобы искало в строках точку с...

[MSSQL] Заменить указанный символ в строке
Можно ли как ни будь заменить в строке 4 (N) символ на указанный? Причем не используя Substring....

Заменить указанный символ на пробел во всей строке
Приветствую, форумчане. Нужна помощь с одной программкой: Заменить указанный символ на пробел во...

В каждой строке текста вставить указанный символ после k-гo символа.
В каждой строке текста вставить указанный символ после k-гo символа.


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

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