[masm32] Ошибка - дублирование метки из макроса при нескольких вызовах - Assembler
Формулировка задачи:
выдает много ошибок в 47-48 строках. не понимаю((
.386 .model flat,STDCALL option casemap :none ;case sensitive include E:\masm32\include\windows.inc include E:\masm32\include\masm32.inc include E:\masm32\include\gdi32.inc include E:\masm32\include\user32.inc include E:\masm32\include\kernel32.inc include E:\masm32\include\msvcrt.inc includelib E:\masm32\lib\masm32.lib includelib E:\masm32\lib\gdi32.lib includelib E:\masm32\lib\user32.lib includelib E:\masm32\lib\kernel32.lib includelib E:\masm32\lib\msvcrt.lib .data a db ? b db ? res db 0 stn db "Result: %d", 0 inp db "Int chislo: ", 0 MyMacro macro x mov al, x m1: div al, 10 add bl, ah cmp al, 10 jnae m1 add bl, al crt_printf, addr stn, bl endm .code start: invoke crt_printf, addr inp invoke crt_scanf, a invoke crt_printf, addr stn, a invoke crt_printf, addr inp invoke crt_scanf, b invoke crt_printf, addr stn, b MyMacro a MyMacro b invoke ExitProcess, 0 end start
Решение задачи: «[masm32] Ошибка - дублирование метки из макроса при нескольких вызовах»
textual
Листинг программы
MyMacro macro x LOCAL m1 <------ добавь mov al, x m1: div ten add bl, ah cmp al, 10 jnae m1 add bl, al invoke crt_printf, addr stn, bl endm
Объяснение кода листинга программы
Код, представленный в вопросе, написан на языке ассемблера (Assembler) для платформы MASM32. Он содержит макрос под названием MyMacro, который выполняет следующие действия:
- LOCAL m1 - объявляет локальную переменную m1 для хранения результата вычислений.
- mov al, x - копирует значение переменной x в регистр al.
- m1: - определяет метку цикла.
- div ten - выполняет деление содержимого регистра al на 10.
- add bl, ah - складывает значения регистров bl и ah, полученные после предыдущего деления.
- cmp al, 10 - сравнивает значение регистра al с 10.
- jnae m1 - если значение регистра al не равно 10, то происходит переход к метке m1, иначе выполнение кода продолжается.
- add bl, al - складывает значения регистров bl и al.
- invoke crt_printf, addr stn, bl - вызывает функцию crt_printf для вывода результата на экран.
- endm - заканчивает определение макроса MyMacro. Поскольку код представлен в виде макроса, то при каждом вызове этого макроса (например, MyMacro x), все действия будут выполняться с использованием текущего значения переменной x. Ошибка, которую вы видите, связана с тем, что при нескольких вызовах макроса MyMacro возникает дублирование метки m1. В ассемблере каждая метка должна быть уникальной, и компилятор не может гарантировать уникальность меток, определенных внутри макроса, при его повторном вызове.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д