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 이외의 값을 반환하면 ; 정상적으로 종료되지 않은 것으로 ; 간주하기 때문에, 반환 값을 언제나 ; 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 이외의 값을 반환하면
; 정상적으로 종료되지 않은 것으로
; 간주하기 때문에, 반환 값을 언제나
; 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] > 주석을 제공하여 가독성을 높일 수 있다. |