Assembly-programming-assembly-memory-segments

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

アセンブリ-メモリセグメント

アセンブリプログラムの3つのセクションについては既に説明しました。 これらのセクションは、さまざまなメモリセグメントも表します。

興味深いことに、セクションキーワードをセグメントに置き換えると、同じ結果が得られます。 次のコードを試してください-

segment .text      ;code segment
   global_start    ;must be declared for linker

_start:            ;tell 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

segment .data      ;data segment
msg db 'Hello, world!',0xa   ;our dear string
len equ $ - msg          ;length of our dear string

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

Hello, world!

メモリセグメント

セグメントメモリモデルは、システムメモリを、セグメントレジスタにあるポインターによって参照される独立したセグメントのグループに分割します。 各セグメントは、特定のタイプのデータを含めるために使用されます。 1つのセグメントは命令コードを含むために使用され、別のセグメントはデータ要素を保存し、3番目のセグメントはプログラムスタックを保持します。

上記の議論に照らして、さまざまなメモリセグメントを次のように指定できます-

  • データセグメント- .data セクションと .bss で表されます。 .dataセクションは、プログラムのデータ要素が保存されるメモリ領域を宣言するために使用されます。 このセクションは、データ要素が宣言された後は展開できず、プログラム全体で静的のままです。 + .bssセクションは、プログラムで後で宣言されるデータ用のバッファを含む静的メモリセクションでもあります。 このバッファメモリはゼロでいっぱいです。
  • コードセグメント- .text セクションで表されます。 これは、命令コードを格納するメモリ内の領域を定義します。 これも固定領域です。
  • スタック-このセグメントには、プログラム内の関数とプロシージャに渡されるデータ値が含まれます。