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 汇编器,如何定义标签两次?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 gcc 生成可以用 nasm 编译的汇编代码 [重复]
NASM 和 GDB 符号:“在符号文件中找不到任何代码段。”