Assembly-programming-assembly-basic-syntax

提供:Dev Guides
移動先:案内検索

アセンブリ-基本構文

アセンブリプログラムは3つのセクションに分けることができます-

  • data セクション、
  • bss セクション、および
  • text セクション。

_data_セクション

*data* セクションは、初期化されたデータまたは定数を宣言するために使用されます。 このデータは実行時に変更されません。 このセクションでは、さまざまな定数値、ファイル名、またはバッファサイズなどを宣言できます。

データセクションを宣言するための構文は-

section.data

_bss_セクション

*bss* セクションは、変数の宣言に使用されます。 bssセクションを宣言するための構文は次のとおりです-
section.bss

_text_セクション

*text* セクションは、実際のコードを保持するために使用されます。 このセクションは、 *global _start* 宣言で始まる必要があります。これは、プログラムの実行が開始される場所をカーネルに通知します。

テキストセクションを宣言するための構文は次のとおりです-

section.text
   global _start
_start:

コメント

アセンブリ言語のコメントはセミコロン(;)で始まります。 空白を含む印刷可能な文字を含めることができます。 それは、次のようにそれ自体で行に表示することができます-

; This program displays a message on screen

または、命令と同じ行で-のように

add eax, ebx     ; adds ebx to eax

アセンブリ言語ステートメント

アセンブリ言語プログラムは、3種類のステートメントで構成されています-

  • 実行可能な指示または指示、
  • アセンブラーディレクティブまたは擬似操作
  • マクロ

実行可能命令*または単に*命令*は、プロセッサに何をすべきかを伝えます。 各命令は、*操作コード(オペコード)で構成されています。 各実行可能命令は、1つの機械語命令を生成します。

アセンブラディレクティブ*または *pseudo-ops は、アセンブリプロセスのさまざまな側面についてアセンブラに通知します。 これらは実行可能ではなく、機械語命令を生成しません。

  • マクロ*は、基本的にテキスト置換メカニズムです。

アセンブリ言語ステートメントの構文

アセンブリ言語ステートメントは、1行に1ステートメントずつ入力されます。 各ステートメントは次の形式に従います-

[label]   mnemonic   [operands]   [;comment]

角括弧内のフィールドはオプションです。 基本的な命令には2つの部分があります。最初の部分は実行される命令(またはニーモニック)の名前で、2番目はコマンドのオペランドまたはパラメーターです。

以下は、典型的なアセンブリ言語ステートメントのいくつかの例です-

INC COUNT        ; Increment the memory variable COUNT

MOV TOTAL, 48    ; Transfer the value 48 in the
                 ; memory variable TOTAL

ADD AH, BH       ; Add the content of the
                 ; BH register into the AH register

AND MASK1, 128   ; Perform AND operation on the
                 ; variable MASK1 and 128

ADD MARKS, 10    ; Add 10 to the variable MARKS
MOV AL, 10       ; Transfer the value 10 to the AL register

アセンブリのHello Worldプログラム

次のアセンブリ言語コードは、画面に文字列「Hello World」を表示します-

section .text
   global _start     ;must be declared for linker (ld)

_start:             ;tells linker entry point
   mov  edx,len     ;message length
   mov  ecx,msg     ;message to write
   mov  ebx,1       ;file descriptor (stdout)
   mov  eax,4       ;system call number (sys_write)
   int  0x80        ;call kernel

   mov  eax,1       ;system call number (sys_exit)
   int  0x80        ;call kernel

section .data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Hello, world!

NASMでのアセンブリプログラムのコンパイルとリンク

PATH環境変数に nasm および ld バイナリのパスが設定されていることを確認してください。 さて、上記のプログラムをコンパイルおよびリンクするには、次の手順を実行します-

  • テキストエディターを使用して上記のコードを入力し、hello.asmとして保存します。
  • hello.asm を保存したディレクトリと同じディレクトリにいることを確認してください。
  • プログラムをアセンブルするには、 nasm -f elf hello.asm と入力します
  • エラーがある場合は、この段階でそれについてプロンプトが表示されます。 それ以外の場合、 hello.o という名前のプログラムのオブジェクトファイルが作成されます。
  • オブジェクトファイルをリンクし、helloという名前の実行可能ファイルを作成するには、 ld -m elf_i386 -s -o hello hello.o と入力します。
  • *。/hello *と入力してプログラムを実行します

すべてを正しく実行すると、「Hello、world!」と表示されます。画面上。