汇编器的NASM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编器的NASM相关的知识,希望对你有一定的参考价值。

参考技术A

NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!','SSE' and 'SSE2'指令集.

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

【中文标题】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系统应使用哪种汇编器进行汇编代码编译。

Nasm汇编编译器

如何阅读着色器的汇编代码

如何阅读着色器的汇编代码

CentOS7写汇编并编译运行汇编代码

如何阅读着色器的汇编代码