2016-11-12 6 views
2

NASM을 사용하여 어셈블리 코드 프로그램을 만들려고하지만 어떤 이유로 오류가 발생합니다. 그것은 문자열을 선언 한 후 쉼표, 콜론, 데코레이터 또는 줄 끝이 올 것이라고 예상하지만 어떻게 문제가 될지 모르겠다 고 말합니다. 조언하십시오.NASM : "쉼표, 콜론, 데코레이터 또는 피연산자 다음에 오는 라인 끝"문자열을 선언 할 때

section .text 
     global main 
main: 
     mov edi,str 
lab3: 
     cmp [edi],' ' 
     je lab1 

     cmp [edi],0x0 
     je lab2 

     mov eax,4 
     mov ebx,1 
     mov ecx,edi 
     mov edx,1 
     int 0x80 
     inc edi 
     jmp lab3 
lab1: 
     inc edi 
     mov eax,4 
     mov ebx,1 
     mov ecx,nwln 
     mov edx,1 
     int 0x80 
     jmp lab3 

lab2: 
     mov eax,1 
     int 0x80 

section .data 
str db 'this is a test',0x0  ;this is the line giving the error 
nwln db 0xa 
+0

nasm은 레이블 다음에 콜론이 필요합니다. 예를 들어'str : db '이것은 테스트입니다.', 0x0' – Jester

+0

@Jester : 유효하지 않은 니모닉 일 때만 : Jester :'-Worphan- 레이블 '옵션이 존재합니다. OP의 프로그램은'str'을'str1'으로 변경할 때 어셈블됩니다. ('cmp mem, immediate' 명령어에서 피연산자 크기가 누락 된 것을 제외하고) –

+3

두통이 적고 항상 사용하는 편이 낫습니다. 또한 내년에 인텔이 라벨 이름과 충돌하는 새로운 지침을 도입하면 어떻게 될지 ... – Jester

답변

6

STR (저장소 작업 레지스터)은 명령어 니모닉입니다. 콜론없이 레이블로 사용하고 있습니다. str: db ...이 효과가있었습니다. 당신은 코드 또는 데이터를 라벨을하고 있는지 string.asm:33: error: unexpected DB/DW/etc. after instruction


그것은 좋은 연습입니다 항상 레이블 이름:를 사용

YASM 여기에 더 유용한 오류 메시지를 제공합니다. 그것은 인간의 독자에게는 명확하고 미래의 니모닉이나 어셈블러 지시어에 대해서는 미래의 증거가됩니다.

그것은 당신이 그 자체로 한 줄에 cqde (안 cqde:) 같은 것을 작성하는 경우 그래서 당신은 경고를받을 또한 -Worphan-labels빌드하는 것이 좋습니다. 이 옵션을 사용하지 않으면 해당 행에 레이블이 표시됩니다. 이 옵션을 사용하면 경고 메시지가 표시되고 cdqe을 입력했음을 알게됩니다! 그것이로 조립하지 않기 때문에 (또는 다른 어떤 피연산자의 x86 명령어.) BTW


는 즉각적이고 메모리 피연산자 지침을 사용하는 경우 cmp byte [edi],' ' 피연산자 크기의 수정을 사용하는 것을 잊지 마세요 모호한 피연산자 크기.

또한 의미있는 레이블 이름을 사용하십시오. lab1 대신 .space_found과 같습니다.