[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, который выполняет следующие действия:

  1. LOCAL m1 - объявляет локальную переменную m1 для хранения результата вычислений.
  2. mov al, x - копирует значение переменной x в регистр al.
  3. m1: - определяет метку цикла.
  4. div ten - выполняет деление содержимого регистра al на 10.
  5. add bl, ah - складывает значения регистров bl и ah, полученные после предыдущего деления.
  6. cmp al, 10 - сравнивает значение регистра al с 10.
  7. jnae m1 - если значение регистра al не равно 10, то происходит переход к метке m1, иначе выполнение кода продолжается.
  8. add bl, al - складывает значения регистров bl и al.
  9. invoke crt_printf, addr stn, bl - вызывает функцию crt_printf для вывода результата на экран.
  10. endm - заканчивает определение макроса MyMacro. Поскольку код представлен в виде макроса, то при каждом вызове этого макроса (например, MyMacro x), все действия будут выполняться с использованием текущего значения переменной x. Ошибка, которую вы видите, связана с тем, что при нескольких вызовах макроса MyMacro возникает дублирование метки m1. В ассемблере каждая метка должна быть уникальной, и компилятор не может гарантировать уникальность меток, определенных внутри макроса, при его повторном вызове.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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