Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ - Assembler
Формулировка задачи:
Вот код. Задание: заменить заданный символ в строке текста на указанный новый символ. Выдает следующую ошибку на строку "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".
Вот код всей программы:
Нашла что-то связанное с цифрами 32 бита и 16, но так и не поняла, в чем суть.
.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
#include <iostream> using namespace std; extern "C"{ void f(); } int main() { f(); system("pause"); return 0; } extern "C" void input(char s[]) { gets(s); }
Решение задачи: «Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ»
textual
Листинг программы
#include <iostream> using namespace std; extern "C"{ void f(); } int main() { f(); system("pause"); return 0; } extern "C" void input(char s[]) { gets(s); }