NASM 汇编器,如何定义标签两次?

Posted

技术标签:

【中文标题】NASM 汇编器,如何定义标签两次?【英文标题】:NASM Assembler, how to define label twice? 【发布时间】:2014-11-17 18:05:53 【问题描述】:

我有不同的“*.asm”文件需要包含在“main.asm”文件中。 我面临的问题是:在许多文件中,我以相同的方式声明了“loop”、“forLoop”、“whileTag”等标签(即同名) 当我尝试 %include "file1.asm" 和 %include "file2.asm" 时,它给了我一个编译错误。它说我不能两次声明相同的标签(即 file1.asm 和 file2.asm,都声明了“loopHere”标签)。 我该如何解决这个问题? 谢谢

本地标签的问题是: 说我有

文件 1:

.label1
;staff

现在文件 2:

;code that uses label1
.label1 ; definition after usage

现在如果我:

%include "file1.asm"
%include "file2.asm"

生成的 main.asm 将是:

.label1
;staff
;code that uses label1
.label1 ; definition after usage

第 3 行的代码实际上会在第 1 行使用 label1 而不是第 4 行的代码

引用自 NASM 手册

以单个句点开头的标签被视为本地标签,这意味着它与之前的非本地标签相关联。

我的错,我刚刚意识到,如果我:

文件 1:

file1: ; add this label
.label1
;staff

现在文件 2:

file2: ; add this label
;code that uses label1
.label1 ; definition after usage

一切都很好!

通过以下方式访问它们:

file1.label1
file2.label1

【问题讨论】:

我会为每个标签想出新的名称,但我觉得为我编写的每个循环都发明一个新的循环名称感到不舒服,必须有一种方法告诉 NASM 使标签独一无二. 我会用local labels解决它。 或者可能不包括但链接。 【参考方案1】:

带有本地标签。本地标签以点开头。

Someproc:
.Somelabel:
Ret

Anotherproc:
.Somelabel:
Ret

它们对它们所在的 proc 可见。您可以通过在它们前面加上 proc 名称来从任何地方访问它们。

Someproc:
.Somelabel:
Ret

Anotherproc:
.Somelabel:
jmp Someproc.Somelabel

【讨论】:

以上是关于NASM 汇编器,如何定义标签两次?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu系统应使用哪种汇编器进行汇编代码编译。

64位的汇编怎么搞

如何使用 gcc 生成可以用 nasm 编译的汇编代码 [重复]

NASM 和 GDB 符号:“在符号文件中找不到任何代码段。”

如何从汇编例程中调用 C 函数并使用 nasm 和 gcc 链接 C 和汇编文件

GNU 汇编器中的本地标签; gdb 打印回溯,就好像标签是函数一样