【问题标题】:Assembly (Intel syntax + NASM) Error: attempt to define a local label before any non-local labels汇编(英特尔语法 + NASM)错误:尝试在任何非本地标签之前定义本地标签
【发布时间】:2017-04-21 01:51:34
【问题描述】:

我对程序集很陌生,我正在尝试使用一个程序。因此,每当我尝试编译它时,都会收到该行的错误,如代码中的 cmets 下所列。

我想知道是否有人知道为什么 NASM 在我为其余的汇编代码定义一些东西时会检测到这个错误?

也许它与 main 的定义方式有关?

附:我只列出了代码的第一部分,因为程序很长。

感谢您的帮助

.xlist               ;attempt to define a local label before any non-local labels
include  stdlib.a     ;  parser: instruction expected
includelib stdlib.lib    ; parser: instruction expected
.list
.286

dseg            segment para public 'data' 
;  Unknown section attribute 'public' ignored on declaration of section `para'
h               word    ?
i               word    ?

cseg            segment para public 'code'
                assume  cs:cseg, ds:dseg

Main

【问题讨论】:

  • 回滚您的编辑,因为后面的错误消息也很有用。搜索这些错误的人可能会发现这个问题,这会很有用。
  • @PeterCordes 哦,对不起,我以为它们没用。

标签: assembly nasm 32-bit intel-syntax


【解决方案1】:

这根本不是 NASM 代码。正如@Jester 所说,它可能是 TASM 或 MASM。

NASM doesn't ASSUME,因此您可以 100% 确定这不是 NASM 代码。


它也绝对不是 Linux 代码。注意.286 指令。这意味着它将是 16 位代码。即使您将语法转换为 NASM,生成的二进制文件也不会在您的 Linux 系统上做任何有用的事情。

(这个问题没有提到Linux,而是the followup does)。

【讨论】:

  • 所以不是编译它:nasm -f elf codeasm.asm -o codeasm.o 我应该在 Windows 上编译 16 位?
  • @io16:不,你应该删除它并找到一些现代的东西来看看。学习 DOS 系统调用和 16 位分段内存是您以后可以做的事情,但现在只是分散注意力。选择一个系统来学习 asm,例如x86-64 Linux。一旦你适应了,就开始了解其他系统的不同之处。
【解决方案2】:

在 NASM 中,以点开头的标签称为本地标签。它被附加到最后一个全局标签上,例如,

L:
.l2: ; it is really L.l2

所以你不能在任何全局标签之前有一个本地标签

【讨论】:

  • 这是正确答案,它消除了所有本地标签错误。谢谢。
  • 正确答案是您的源文件根本不是 nasm 语法。看起来更像 masm 或 tasm。
  • @Jester 就像我说的,我对装配很陌生。所以我会调查一下。请问您认为它在 masm 或 tasm 语法中的含义是什么?
  • 因为使用了所有指令。例如,NASM Doesn't ASSUME
猜你喜欢
  • 2015-10-21
  • 2019-01-22
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2020-06-06
相关资源
最近更新 更多