NASM 어셈블리 언어

지시어

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의 지시어를 알아볼 수 있었다.

댓글

댓글 본문
graphittie 자세히 보기