Сборка (синтаксис Intel + NASM) Ошибка: попытка определить локальную метку перед любыми нелокальными метками

Я совсем новичок в сборке и пытаюсь работать с программой. Поэтому всякий раз, когда я пытаюсь его скомпилировать, я получаю ошибку для строки, как указано в комментариях в коде.

Мне интересно, есть ли у кого-нибудь идеи, почему NASM обнаруживает эти ошибки, когда я определяю некоторые вещи для остальной части ассемблерного кода?

Может быть, это как-то связано с тем, как определяется main?

P.S. Я привел только первую часть кода, так как программа достаточно длинная.

Спасибо вам за помощь

.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

person C-PROG    schedule 06.12.2016    source источник
comment
Откатил ваше редактирование, потому что более поздние сообщения об ошибках тоже полезны. Люди, которые ищут эти ошибки, могут найти этот вопрос, что было бы полезно.   -  person Peter Cordes    schedule 07.12.2016
comment
@PeterCordes О, извините, я думал, что они бесполезны.   -  person C-PROG    schedule 08.12.2016


Ответы (2)


В NASM метка, начинающаяся с точки, называется локальной меткой. Он добавляется к последней глобальной метке, например,

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

Таким образом, вы не можете иметь локальную метку перед любыми глобальными

person Yan Zhou    schedule 06.12.2016
comment
Это правильный ответ, и он устраняет все ошибки локальных меток. Спасибо. - person C-PROG; 06.12.2016
comment
Правильный ответ заключается в том, что ваш исходный файл вообще не соответствует синтаксису nasm. Больше похоже на масм или тасм. - person Jester; 06.12.2016
comment
@Jester Как я уже сказал, я новичок в сборке. Так что я посмотрю на это. Могу я спросить, из-за чего, по вашему мнению, это синтаксис masm или tasm? - person C-PROG; 06.12.2016
comment
Из-за всех используемых директив. Например, NASM НЕ ПРЕДПОЛАГАЕТ - person Jester; 06.12.2016

Это вовсе не код NASM. Как говорит @Jester, это, вероятно, TASM или MASM.

NASM не ASSUME, так что вы можете быть на 100% уверены, что это не код NASM.


Это определенно не код Linux. Обратите внимание на директиву .286. Это означает, что это будет 16-битный код. Даже если вы преобразуете синтаксис в NASM, полученный двоичный файл не сделает ничего полезного в вашей системе Linux.

(В этом вопросе не упоминается Linux, но делает).

person Peter Cordes    schedule 08.12.2016
comment
Так что вместо того, чтобы компилировать его с помощью: nasm -f elf codeasm.asm -o codeasm.o, я должен скомпилировать его для 16 бит и в Windows? - person C-PROG; 09.12.2016
comment
@io16: Нет, вы должны удалить его и найти что-нибудь современное. Изучение системных вызовов DOS и 16-битной сегментированной памяти — это то, чем вы могли бы заняться позже, но пока это просто отвлечение. Выберите одну систему для изучения asm, например. x86-64 линукс. Как только вы освоитесь, начните изучать, чем отличаются другие системы. - person Peter Cordes; 09.12.2016