【问题标题】:Issues using a local label in a macro in MASM在 MASM 的宏中使用本地标签的问题
【发布时间】:2013-12-30 08:06:52
【问题描述】:

我要编写一个宏,它以E,NE,A,B... 作为参数和一个命令,即mov eax,ebx,如果前面的cmp 操作设置的条件为真,它将执行。

示例调用如下所示。

cmp bx,20
mDoIf E,<call Dumpregs>

我遇到的问题是,当我尝试使用以下定义进行编译时,我得到了两个错误之一。使用LOCAL 定义我得到Undefined Symbol Error: ??0000。当我删除 LOCAL 定义时,我收到一个错误:jump destination must specify a label

mDoIf MACRO op, command
    LOCAL true
    J&op true
    exitm
    true: 
        command
        exitm

endm

任何帮助将不胜感激。谢谢你。

【问题讨论】:

  • 尝试左对齐标签“true:”。
  • 对不起,没有骰子。我想我应该提供一些关于我用来编译东西的信息。我正在使用 Visual Studio 2012 专业版和来自 Kip Irvine 的 Assembly Langauge for x86 处理器第 6 版的 irvine32.lib。过去,将标签缩进并没有让我感到悲伤,尽管我确实尝试了你的建议,看看它是否可行。

标签: assembly macros x86 masm


【解决方案1】:

试试这个:

mDoIf MACRO op, command
    LOCAL L1, L2

    J&op    short L1
    jmp     short L2

L1: 
    call command
L2:
    exitm
endm

.code
start:
    mov     eax, 1
    cmp     eax, 2
    mDoIf l, DumpRegs

    invoke  ExitProcess, 0
end start

【讨论】:

  • 非常感谢。他们在宏的章节中没有提到使用short。你能分解一下为什么这行得通,而不是我的行不通吗?我也刚刚对其进行了测试,只要您在 中包含第二个参数并且它是有效的汇编指令,您就可以使用 L1: command
  • 它应该在没有short 的情况下工作。你的问题是放错了exitm。如果那是在您的标签之前,则在扩展宏时预处理器将不会“看到”它们。宏的众多用途之一是帮助减少打字,为什么要在宏参数中添加额外的字符?
  • 同意,但我们将接受任何有效的汇编指令,而不仅仅是调用。即如果作为参数传入,我应该能够执行 mov eax, ebx。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多