어셈블리-상수
상수를 정의하는 NASM에서 제공하는 몇 가지 지시문이 있습니다. 우리는 이미 이전 장에서 EQU 지시문을 사용했습니다. 특히 세 가지 지침에 대해 논의 할 것입니다.
- EQU
- %assign
- %define
EQU 지침
그만큼 EQU지시문은 상수를 정의하는 데 사용됩니다. EQU 지시문의 구문은 다음과 같습니다.
CONSTANT_NAME 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 지시어의 사용을 보여줍니다-
SYS_EXIT equ 1
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
mov eax,SYS_EXIT ;system call number (sys_exit)
int 0x80 ;call kernel
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 지시어
그만큼 %assign지시문은 EQU 지시문과 같은 숫자 상수를 정의하는 데 사용할 수 있습니다. 이 지시문은 재정의를 허용합니다. 예를 들어 상수 TOTAL을 다음과 같이 정의 할 수 있습니다.
%assign TOTAL 10
나중에 코드에서 다음과 같이 재정의 할 수 있습니다.
%assign TOTAL 20
이 지시문은 대소 문자를 구분합니다.
% define 지시어
그만큼 %define지시문을 사용하면 숫자 및 문자열 상수를 모두 정의 할 수 있습니다. 이 지시문은 C의 #define과 유사합니다. 예를 들어 상수 PTR을 다음과 같이 정의 할 수 있습니다.
%define PTR [EBP+4]
위 코드는 PTR 을 [EBP + 4]로 대체합니다 .
이 지시문은 또한 재정의를 허용하며 대소 문자를 구분합니다.