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

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