2016-12-06 12 views
2

어셈블리와 관련하여 매우 새로운 것으로 프로그램을 사용하려고합니다. 그래서 컴파일 할 때마다, 코드의 주석 아래에 나열된 것처럼 라인에 대한 에러가 발생합니다.어셈블리 (인텔 구문 + NASM) 오류 : 로컬 레이블이 아닌 로컬 레이블을 정의하려고 시도합니다.

다른 어셈블리 코드에 대해 몇 가지 사항을 정의 할 때 NASM에서이 오류를 감지하는 이유가 있다면 궁금합니다.

어쩌면 주체 정의 방법으로 뭔가를해야합니까?

P. 프로그램이 상당히 길기 때문에 코드의 첫 번째 부분 만 나열했습니다.

은 도움 NASM에서

.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

나중에 오류 메시지가 유용하기 때문에 편집을 롤백 할 수 있습니다. 이러한 오류를 검색하는 사람들은이 질문을 찾을 수 있습니다. –

+0

@PeterCordes 오 죄송합니다. 나는 그들이 쓸모 없다고 생각했습니다. –

답변

2

점으로 시작하는 레이블 지역 레이블이라고 주셔서 감사합니다.

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

그래서 당신이 모든 NASM 코드 아니라 전역 사람

+0

이것은 정답이며 모든 로컬 레이블 오류를 제거합니다. 고맙습니다. –

+2

정답은 소스 파일이 nasm 구문이 아님을 나타냅니다. 경련이나 틈새처럼 보입니다. – Jester

+0

@Jester 내가 말했듯이, 나는 아주 새로운 어셈블리입니다. 그래서 나는 그것을 조사 할 것이다. 당신이 그것이 연옥이나 tasm 구문에 있다고 생각하기 때문에 물어봐도 될까요? –

2

전에 지역 레이블을 가질 수 없습니다, 예를 들어, 지난 글로벌 라벨에 추가됩니다. @Jester가 말했듯이, 아마도 TASM 또는 MASM 일 것입니다.

NASM doesn't ASSUME이므로 100 % 확신 할 수 있으므로 NASM 코드가 아닙니다.


분명히 리눅스 코드도 아닙니다. .286 지시문에 유의하십시오. 이는 16 비트 코드라는 것을 의미합니다. 구문을 NASM으로 변환하더라도 결과 바이너리는 Linux 시스템에서 유용하지 않습니다.

(이 질문에는 Linux는 언급되지 않지만 the followup does).

+0

다음과 같이 컴파일하는 대신에 : nasm -f elf codeasm.asm -o codeasm.o 16 비트 및 Windows에서 컴파일해야합니까? –

+0

@ io16 : 아니요, 그것을 지워서보고 현대적인 것을 찾아야합니다. DOS 시스템 호출과 16 비트 분할 메모리를 학습하면 나중에 할 수있는 일이지만, 지금은 혼란 스러울뿐입니다. 한 가지 시스템을 선택하여 예를 들어 asm을 배웁니다. x86-64 Linux. 일단 편안하다면 다른 시스템이 어떻게 다른지 배우십시오. –