Assembly-programming-assembly-constants
提供:Dev Guides
アセンブリ-定数
NASMが提供する、定数を定義するディレクティブがいくつかあります。 前の章ですでにEQUディレクティブを使用しました。 特に3つのディレクティブについて説明します-
- EQU
- %割り当てます
- 定義する
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]に置き換えます。
このディレクティブは再定義も許可し、大文字と小文字が区別されます。