2016-12-06 2 views
2

Je suis assez nouveau en ce qui concerne l'assemblage et j'essaie de travailler avec un programme. Donc, chaque fois que j'essaie de le compiler, j'obtiens l'erreur pour la ligne, comme indiqué dans les commentaires dans le code.Assemblage (syntaxe Intel + NASM) Erreur: tentative de définition d'une étiquette locale avant toute étiquette non locale

Je me demande si quelqu'un a des idées pour lesquelles NASM détecte ces erreurs lorsque je définis certaines choses pour le reste du code d'assemblage?

Peut-être qu'il doit faire quelque chose avec la façon dont le principal est défini?

P.S. J'ai énuméré seulement la première partie du code, puisque le programme est assez long.

Nous vous remercions de l'aide

.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 
+0

Vous avez annulé votre modification car les messages d'erreur ultérieurs sont également utiles. Les personnes effectuant une recherche sur ces erreurs pourraient trouver cette question, ce qui serait utile. –

+0

@PeterCordes Oh désolé, je pensais qu'ils sont inutiles. –

Répondre

2

En MSNA une étiquette commençant par un point est appelé une étiquette locale. Il est ajouté à la dernière étiquette mondiale, par exemple,

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

Donc, vous ne pouvez pas avoir une étiquette locale avant que les

globales
+0

Cette réponse est la bonne et supprime toutes les erreurs d'étiquette locale. Je vous remercie. –

+2

La réponse correcte est que votre fichier source n'est pas dans la syntaxe nasm du tout. Ressemble plus au masm ou au tasm. – Jester

+0

@Jester Comme je l'ai dit, je suis assez nouveau pour l'assemblage. Donc, je vais regarder dans cela. Puis-je demander à cause de quoi pensez-vous qu'il est dans la syntaxe masm ou tasm? –

2

Ce n'est pas le code MSNA du tout. Comme le dit @Jester, c'est probablement TASM ou MASM.

NASM doesn't ASSUME, donc vous pouvez être sûr à 100% que ce n'est pas un code NASM.


Ce n'est définitivement pas du code Linux. Notez la directive .286. Cela signifie que ce sera le code 16 bits. Même si vous convertissez la syntaxe en NASM, le binaire résultant ne fera rien d'utile sur votre système Linux. (Cette question ne mentionne pas Linux, mais the followup does).

+0

Donc, au lieu de le compiler avec: nasm -f elf codeasm.asm -o codeasm.o Je devrais le compiler pour 16 bits et sur Windows? –

+0

@ io16: Non, vous devriez le supprimer et trouver quelque chose de moderne à regarder. Apprentissage des appels système DOS et de la mémoire segmentée 16 bits est quelque chose que vous pourriez faire plus tard, mais c'est juste une distraction pour l'instant. Choisissez un système pour apprendre asm, par ex. x86-64 Linux. Une fois que vous êtes à l'aise, commencez à apprendre comment les autres systèmes sont différents. –