アセンブリ-定数
定数を定義する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]に置き換えます。
このディレクティブでは再定義も可能であり、大文字と小文字が区別されます。