Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ - 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". Вот код всей программы:
.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);
}
Нашла что-то связанное с цифрами 32 бита и 16, но так и не поняла, в чем суть.

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

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);
}

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы