4.2.4) 지시어
앞서 지시어를, 소스 코드 중 실제 기계어로 변환 가능한 명령어가 아니라 소스 코드를 변환하는 프로그램에 전달하는 메시지라고 설명한 바 있다. 여기서는 자주 사용되는 지시어들에 대해 알아본다. 참고로 이 절의 내용은 거의 대부분이 “PC 어셈블리어” 문서에서 가져온 것이다.
4.2.4.1) equ 지시어
equ 지시어는 심볼을 정의할 때 사용한다. 심볼(symbol)이란 어셈블리 프로그래밍을 할 때 사용되는 상수를 말하며, 다음과 같이 사용한다.
symbol equ value
한 번 정의된 심볼의 값은 절대로 재정의 될 수 없다.
4.2.4.2) % 지시어
% 지시어 또한 상수 매크로를 정의할 때 사용할 수 있다.
%define identifier value
이 구문은 identifier를 value로 정의한다. 매크로는 심볼보다 유연한데, 왜냐하면 매크로는 심볼과 달리 재정의 될 수 있고 단순한 수가 아니어도 되기 때문이다.
여기까지의 내용을 코드로 먼저 정리해보자.
constant.asm |
%include 'handy/handy.inc'
; equ 지시어를 이용하여 상수를 정의합니다. EQU_VALUE equ 100
; % 지시어를 이용하여 상수 매크로를 정의합니다. %define MACRO_VALUE 200
; % 지시어를 이용하여 구문을 정의합니다. equ로는 할 수 없습니다. %define MOV_ESI_300 mov esi, 300 ; MOV_ESI_300_EQU equ mov esi, 300
segment .text ; _main 프로시저가 전역에서 접근 가능한 프로시저임을 ; global 지시어를 이용하여 어셈블러에 전달합니다. global _main
; _main 레이블 정의입니다. _main: push ebp mov ebp, esp
; equ 지시어로 정의한 상수 사용 예제 mov esi, EQU_VALUE call print_int call print_newline
; % 지시어로 정의한 상수 매크로 사용 예제 mov esi, MACRO_VALUE call print_int call print_newline
; % 지시어로 정의한 구문 사용 예제 MOV_ESI_300 call print_int call print_newline
mov eax, 0 mov esp, ebp pop ebp ret |
4.2.4.3) 세그먼트 정의 지시어
작성하는 코드가 프로그램이 실행되어 프로세스 메모리에 올라갔을 때 어느 세그먼트에 위치하는지를 어셈블러에 전달하는 역할을 한다. segment 키워드로 시작하고 곧이어 메모리를 위치시킬 세그먼트를 넘긴다. 세그먼트는 다음과 같은 것들이 있다.
- .data
> 초기화된 데이터가 저장되는 데이터 세그먼트다.
- .bss
> 초기화되지 않은 데이터가 저장되는 데이터 세그먼트다.
- .text
> 코드가 저장되는 코드 세그먼트다.
여기에서 data와 bss에 대해 설명이 더 필요할 것 같다. 하지만 지금 당장은 data와 text만 사용하면 된다고 이해했으면 한다. 후에 이 문서에서 이에 대해 더 자세하게 설명할 것이다.
4.2.4.4) 데이터 지시어
데이터 지시어는 데이터 세그먼트에서 메모리상의 공간을 정의하는 데 사용된다. NASM에서 지원하는 데이터 지시어에 대해 알아보자. NASM에서는 메모리 공간을 정의하는 방법이 2가지 있다. 하나는 메모리 공간만을 정의하는 resx 계열 지시어고, 다른 하나는 메모리 공간과 초기 값을 지정하는 dx 계열 지시어다. x에는 다음과 같은 문자(letter)가 들어갈 수 있다.
문자(Letter) |
dx |
resx |
단위(Unit) |
another name |
b |
db |
resb |
1바이트 |
바이트(byte) |
w |
dw |
resw |
2바이트 |
워드(word) |
d |
dd |
resd |
4바이트 |
더블 워드(double word, dword) |
q |
dq |
resq |
8바이트 |
쿼드 워드(quard word, qword) |
t |
dt |
rest |
10바이트 |
텐 바이트(ten byte, tbyte) |
혹시 첫 예제에서 문자열 sHelloWorld의 오른쪽에 db라는 단어가 있던 것을 기억하는가? 그것이 바로 여기서 설명한 데이터 지시어의 일종이다.
이와 같이 NASM의 지시어를 알아볼 수 있었다.