【问题标题】:Use procedure scope to avoid local labels?使用过程范围来避免本地标签?
【发布时间】:2016-02-12 22:45:33
【问题描述】:

我将一些 MASM 代码移植到 NASM。除了需要本地标签外,该端口相当轻松。需要本地标签是因为 MASM 代码有多个过程,并且一些标签对过程是通用的。例如

;; MASM code
_FOO PROC
  ...
Exit_Failure:
  ...
Exit_Success:
  ...
  ret
_FOO ENDP

_BAR PROC
  ...
Exit_Failure:
  ...
Exit_Success:
  ...
  ret
_BAR ENDP

在 NASM 下,我必须使用本地标签。例如:

;; NASM code
  global _FOO
  section .text

_FOO:
  ...
.Exit_Failure:
  ...
.Exit_Success:
  ...
  ret

当代码与调试信息组合在一起时,它会产生令人眼花缭乱的标签(对我来说)。代码会产生标签_FOO.Exit_Failure_FOO.Exit_Success等等。除了碍眼之外,它们还使移植变得复杂,因为我必须在每个标签上添加一个点。

我似乎找不到 NASM 的“命名”代码部分的概念,因此标签可以限定范围。

如何确定程序范围以避免需要本地标签?

【问题讨论】:

    标签: nasm


    【解决方案1】:

    NASM 部分提供了以点为前缀的本地标签功能,以便您可以制作过程本地标签。没有与 MASM 等效的设置来使标签始终位于过程的本地,因为 NASM 本身并不真正识别过程的存在。它只是保存标签的记录,我们有时将其用作过程入口点,而 NASM 却无法真正区分这些标签或任何其他非本地标签。

    您可以制作以%% 为前缀的宏本地标签而不是句点,这样您就可以在同一个函数中多次使用同一个宏,仅此而已。

    【讨论】:

    • 对不起,我之前说过宏本地标签以 %$ 为前缀。我把我的前缀弄混了。它们实际上以 %% 为前缀。 %$ 前缀适用于上下文本地标签,它们也用于宏中,尽管它们是上下文而不是宏的本地标签。有点乱。
    猜你喜欢
    • 2014-09-10
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2011-09-07
    • 2016-06-05
    相关资源
    最近更新 更多