NASM에서 상수를 정의하는 몇가지의 지시어가 있다. 이미 EQU 지시어를 이전 장에서 사용했다. 다음 세 가지 지시어에 대해 다루어 볼 것이다.
EQU 지시어는 상수를 정의하는데 사용된다. EQU 지시어 구문은 다음과 같다.
상수명 EQU expression
예를 들어,
TOTAL_STUDENTS equ 50
어셈블리 코드 상에서 다음과 같이 상수를 사용할 수 있다.
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
EQU 구문의 피연산자는 표현식이 될 수 있다.
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
AREA를 200으로 정의하는 코드이다.
예제
다음은 EQU 지시어 사용을 설명하는 코드이다.
❗️ 64비트 Intel macOS에서 동작하는 코드이다.
SYS_EXIT equ 0x2000001 ; exit 시스템 콜 번호
SYS_WRITE equ 0x2000004 ; write 시스템 콜 번호
STDIN equ 0 ; 표준입력
STDOUT equ 1 ; 표준출력
section .text
global _main
_main:
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, msg1
mov rdx, len1
syscall
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, msg2
mov rdx, len2
syscall
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, msg3
mov rdx, len3
syscall
mov rax, SYS_EXIT
mov rdi, 0 ; exit 함수의 파라미터에 0을 저장한다. 그렇지 않으면 프로그램 종료 시 exit code를 리턴한다.
syscall
section .data
msg1 db 'Hello, programmers!', 0xA,0xD
len1 equ $ - msg1
msg2 db 'welcome to the world of,', 0xa,0xd
len2 equ $ - msg2
msg3 db 'Linux assembly programming! '
len3 equ $ - msg3
위의 코드를 컴파일하고 실행하면, 다음과 같은 결과를 얻을 수 있다.
Hello, programmers!
Welcome to the world of,
Linux assembly programming!
%assign 지시어는 EQU 지시어와 같이 숫자 상수를 정의하는데 사용된다. %assign 지시어는 재정의를 허용한다. 예를 들어, 다음과 같이 TOTAL 상수를 정의할 수 있다.
%assign TOTAL 10
그 후에, TOTAL을 다음과 같이 재정의 할 수 있다.
%assign TOTAL 20
%define 지시어는 숫자 상수와 문자열 상수 정의 모두 허용한다. %assign 지시어는 C언어의 #define과 유사하다. 다음과 같이 상수 PTR을 정의할 수 있다.
%define PTR [EBP + 4]
위 코드에서 PTR은 [EBP + 4]로 대체된다.
%define 지시어는 재정의가 가능하고 대소문자를 구분한다.