NASM 어셈블리 언어

기본 구문

4.2) 문법

이제 본격적으로 어셈블리 언어의 문법에 대해 알아보자.

 

4.2.1) 기본 구문

코드 영역에 작성된 어셈블리 소스 코드를 명령어(instruction)라고 한다기본 구문은 다음과 같다.

[label:] [mnemonic [operands]] [; comment]

어셈블리 코드는 모두이 단 하나의 규칙만으로 작성된다각각의 요소가 무엇인지 설명하기 전에 몇 가지 예를 통해 이를 문법에 대응시켜보자일단 꺾쇠괄호(‘[’, ‘]’)가 생략 가능한 기호라는 사실만 기억하고 있으면 된다다음은 방금 보였던 코드에 주석을 추가로 달고 불필요한 부분을 정리한 코드이다.

Instruction.asm

_main:

push ebp

mov ebp, esp

 

push sHelloWorld 명령어와 주석을 조합할 수 있습니다.

call print_string ; print_string 프로시저를 호출합니다.

 

mov eax, 0 빈 줄에도 주석을 달 수 있습니다.

프로세스가 이외의 값을 반환하면

정상적으로 종료되지 않은 것으로

간주하기 때문에반환 값을 언제나

; 0으로 맞춰주어야 합니다.

 

end1: mov esp, ebp 구문의 모든 요소를 적용한 명령입니다.

end2: pop ebp

end3: ret 프로시저를 반환합니다.

end4: ; _main의 경우 프로그램이 종료됩니다.

각각에 대해 차근차근 대응시켜보겠다.

_main:

label은 레이블이라고 읽는다명령어의 주소를 획득하고 싶다면 레이블을 등록하여 가져올 수 있다레이블은 생략 가능한 요소이지만레이블만으로 구문을 완성할 수 있다.

이 구문은 문법의 'label(_main) :'에 대응한다.

push ebp

push와 같은 요소를 연상 기호(mnemonic)라고 한다이는 기계어의 명령 코드에 일대일 대응하는 기호로실제 레지스터 등에 값을 대입하는 등의 명령을 CPU에 전달한다연상 기호는 니모닉이라고 읽는다. ebp와 같이 연상 기호의 인자로 넘어가는 요소를 피연산자(operand)라고 한다.

이 구문은 문법의 'mnemonic(push) operands(ebp)'에 대응한다.

mov ebp, esp

이 구문은 문법의 ‘mnemonic(mov) operands(ebp, esp)’에 대응한다.

push sHelloWorld 명령어와 주석을 조합할 수 있습니다.

이 구문은 문법의 ‘mnemonic(push) operands(sHelloWorld) ; comment'에 대응한다.

call print_string ; print_string 프로시저를 호출합니다.

이 구문 역시 문법의 ‘mnemonic(call) operands(print_string) ; comment'에 대응한다.

mov eax, 0 빈 줄에도 주석을 달 수 있습니다.

이 구문 마찬가지로문법의 ‘mnemonic(mov) operands(eax, 0) ; comment'에 대응한다.

프로세스가 이외의 값을 반환하면

정상적으로 종료되지 않은 것으로

간주하기 때문에반환 값을 언제나

; 0으로 맞춰주어야 합니다.

이 구문은 문법의 ‘; comment'에 대응한다추가하자면 이 주석의 내용은 QuickNASM 프로그램을 사용하는 사람들에게는 중요하므로, QuickNASM 사용자라면 기억하고 있어야 한다.

end1: mov esp, ebp 구문의 모든 요소를 적용한 명령입니다.

이 구문은 문법의 ‘label(end1) : mnemonic(mov) operands(esp, ebp) ;comment'에 대응한다.

end2: pop ebp

이 구문은 문법의 ‘label(end2) : mnemonic(pop) operands(ebp)'에 대응한다.

end3: ret 프로시저를 반환합니다.

이 구문은 문법의 ‘label(end3) : mnemonic(ret) ; comment'에 대응한다.

end4: ; _main의 경우 프로그램이 종료됩니다.

이 구문은 문법의 ‘label(end4) : ; comment'에 대응한다.

이 예제를 통해 NASM의 문법을 대강이나마 짐작할 수 있을 것이다정리하면 다음과 같다.

[label:] [mnemonic [operands]] [; comment]

- [label:]

명령어의 주소를 획득하고 싶다면 레이블을 등록하여 가져온다.

- mnemonic

기계어의 명령 코드(operation code, opcode)에 일대일 대응하는 연상 기호이다.

- [operands]

연상 기호의 인자로 넘어가는 피연산자를 말한다.

- [; comment]

주석을 제공하여 가독성을 높일 수 있다.

 

댓글

댓글 본문
작성자
비밀번호
graphittie 자세히 보기