NASM은 변수 저장 공간을 할당을 위한 다양한 define directive(지시어)를 제공한다. define directive(지시어)는 저장 공간의 할당을 위해 사용된다. 하나 또는 그 이상의 바이트를 초기화하는데 사용된다.
초기화 된 데이터를 저장 공간에 할당하는 구문은 다음과 같다.
[변수 이름] 지시어 초기값 [, 초기값]...
변수 이름은 각 저장 공간의 식별자이다. 어셈블러는 데이터 세그먼트에 정의된 각 변수 이름의 오프셋 값을 처리한다.
다음은 define directive(지시어)의 다섯 가지 기본 형태이다.
지시어 | 목적 | 저장 공간 |
---|---|---|
DB | Byte 정의 | 1바이트 할당 |
DW | Word 정의 | 2바이트 할당 |
DD | Doubleword 정의 | 4바이트 할당 |
DQ | Quadword 정의 | 8바이트 할당 |
DT | Ten Bytes 정의 | 10바이트 할당 |
define directive(지시어)를 사용하는 예이다.
choices DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
아래의 사항들을 주의해야 한다.
다음은 define directive(지시어)의 사용을 보여주는 프로그램의 코드이다.
❗️ 64비트 Intel macOS에서 동작하는 코드이다.
section .text
global _main ; 링커를 위해 반드시 선언해야 한다.
_main: ; 링커에게 시작점을 알려준다.
mov rdx, 1 ; 메세지 길이
mov rsi, choice ; 출력할 메세지
mov rdi, 1 ; 파일 디스크립터(표준출력)
mov rax, 0x2000004 ; 시스템 콜 번호(write)
syscall ; 시스템 콜 호출
mov rax, 0x2000001 ; 시스템 콜 번호(exit)
mov rdi, 0 ; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
syscall ; 시스템 콜 호출
section .data
choice DB 'y'
컴파일 후 실행하면, 다음과 같은 결과를 확인할 수 있다.
y
reserve directive는 초기화 되지 않은 데이터를 위한 저장 공간을 할당하는데 사용한다. reserve directive는 reserve할 공간 수를 지정하는 한 개의 피연산자를 받는다. 각 define direct에 대응하는 reserve directive가 존재한다.
다음은 reserve directive의 다섯 가지 기본 형태이다.
Directive | Purpose |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
프로그램에 여러개의 데이터를 정의할 수 있다. 예를 들어
choice DB 'Y' ; y의 ASCII 값은 79H
number1 DW 12345 ; 12345D = 3039H
number2 DD 123456789 ; 123456789D = 75BCD15H
어셈블러는 여러개의 변수 정의에 대해 연속된 메모리를 할당한다.
TIMES directive는 같은 값으로 여러개를 초기화한다. 예를 들어, 다음과 같은 구문을 사용하여 길이가 9인 marks 배열을 정의하고 모두 0으로 초기화할 수 있다.
marks TIMES 9 DW 0
TIMES directive는 배열과 테이블을 정의하는데 유용하다. 다음은 9개의 에스터리스크를 출력하는 프로그램이다.
❗️ 64비트 Intel macOS에서 동작하는 코드이다.
section .text
global _main ; 링커를 위해 반드시 선언해야 한다.
_main: ; 링커에게 시작점을 알려준다.
mov rdx, 9 ; 메세지 길이
mov rsi, stars ; 출력할 메세지
mov rdi, 1 ; 파일 디스크립터(표준출력)
mov rax, 0x2000004 ; 시스템 콜 번호(write)
syscall ; 시스템 콜 호출
mov rax, 0x2000001 ; 시스템 콜 번호(exit)
mov rdi, 0 ; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
syscall ; 시스템 콜 호출
section .data
stars times 9 db '*' ; times directive로 '*'가 9개 있는 stars문자열 정의
위의 코드를 컴파일하고 실행하면, 다음의 결과를 얻을 수 있다.
*********