【问题标题】:Passing a variable value to a macro将变量值传递给宏
【发布时间】:2018-01-29 14:57:36
【问题描述】:

如果我有一个名为 test 的宏,并且我想将一个变量值传递给它,我应该怎么做? 例如:

test macro num
    ; ...
endm

我这样称呼它:

test num

并且 num 在数据段中定义为例如 db。 我的问题是,这可能吗?为什么我这样做时会出错?我什至需要这样做吗?我不能只在宏内部访问num 而不将其作为参数传递吗?

无论如何,谢谢。

编辑 1:这是实际代码的示例:

    ;... in the data segment i have car_fich defined like this
    car_fich    db    9
    ; ........................................................

fill_array macro car_fich
    mov ah, car_fich
    ; .. do other things
endm

Main proc

    fill_array car_fich

Main endp

【问题讨论】:

  • 你指的是什么汇编程序?您的 MACRO 名称“test”和 test 指令之间可能存在名称冲突。
  • @zx485 名称 test 只是我解释问题的一个例子,而不是实际代码
  • 那么实际的代码是什么样的呢? minimal reproducible example?
  • @zx485 用实际代码示例编辑问题

标签: assembly macros


【解决方案1】:

我仍然猜想您在数据段中的 car_fich 和宏定义中的 car_fich 之间存在名称冲突。为什么你们两个名字一样?

一些汇编器使用符号的最新定义作为当前符号(这与在高级语言中使用scope根本不同)。

所以在这种情况下,宏中的定义将覆盖数据段中的定义,本质上使后者不可见并因此产生错误(很可能;感谢汇编程序,否则将更难调试)。

如果是这种情况,可以通过更改宏中的符号来检查:

    ;... in the data segment i have car_fich defined like this
    car_fich    db    9
    ; ........................................................

fill_array macro m_car_fich        ; changed symbol name
    mov ah, m_car_fich             ; changed symbol name
    ; .. do other things
endm

Main proc

    fill_array car_fich            ; refers to data segment variable

Main endp

【讨论】:

  • 我需要在数据段中定义m_car_fich吗?
  • @jeyejow:没有。你的问题似乎是你混淆了数据段中的变量定义和宏中的参数定义。两者都是符号,因此它们应该(理想情况下)是唯一的。在此示例中,您将符号 car_fich 传递给宏符号 m_car_fichcar_fich 被视为 MACRO 中的参数 - 在 MACRO 范围内,此参数的名称为 m_car_fich。它们不应该具有相同的符号/名称,因为它们的含义不同。
  • ohhok,我对组装很陌生,也许我应该再次阅读定义,我将使用该修复程序对其进行测试,如果它无法正常工作,请接受您的 awnser
  • 还有一个问题,我可以从宏内部调用其他未传递给它的变量吗?例如,如果我在 datasegment 中有其他变量称为 var,我可以在宏内部说类似 mov ah, var 的内容吗?还是我需要将它传递给宏以便我可以使用该值?
  • @jeyejow:是的,你可以!但是要小心全局变量(就像在大多数编程语言中一样)。有时它会打败宏的使用。因此,如果您没有像 test MACRO var 这样的第二个定义,那么您可以使用在 MACRO 的数据段中定义的名为 var 的 GLOBAL 变量,这将使 var 成为 LOCAL 变量而不是 GLOBAL 了。跨度>
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多