어셈블리-상수

상수를 정의하는 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]로 대체합니다 .

이 지시문은 또한 재정의를 허용하며 대소 문자를 구분합니다.