アセンブリ-定数

定数を定義するNASMによって提供されるいくつかのディレクティブがあります。前の章ですでにEQUディレクティブを使用しました。特に3つの指令について説明します-

  • 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]に置き換えます。

このディレクティブでは再定義も可能であり、大文字と小文字が区別されます。