Assembly-programming-assembly-memory-management

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

アセンブリ-メモリ管理

  • sys_brk()*システムコールはカーネルによって提供され、後で移動することなくメモリを割り当てます。 この呼び出しは、メモリ内のアプリケーションイメージのすぐ後ろにメモリを割り当てます。 このシステム機能を使用すると、データセクションで使用可能な最大アドレスを設定できます。

このシステムコールは、設定する必要がある最高のメモリアドレスである1つのパラメータを取ります。 この値はEBXレジスタに保存されます。

エラーが発生した場合、sys_brk()は-1を返すか、負のエラーコード自体を返します。 次の例は、動的メモリ割り当てを示しています。

次のプログラムは、sys_brk()システムコールを使用して16kbのメモリを割り当てます-

section .text
   global _start         ;must be declared for using gcc

_start:                  ;tell linker entry point

   mov  eax, 45      ;sys_brk
   xor  ebx, ebx
   int  80h

   add  eax, 16384   ;number of bytes to be reserved
   mov  ebx, eax
   mov  eax, 45      ;sys_brk
   int  80h

   cmp  eax, 0
   jl   exit    ;exit, if error
   mov  edi, eax     ;EDI = highest available address
   sub  edi, 4       ;pointing to the last DWORD
   mov  ecx, 4096    ;number of DWORDs allocated
   xor  eax, eax     ;clear eax
   std           ;backward
   rep  stosd            ;repete for entire allocated area
   cld           ;put DF flag to normal state

   mov  eax, 4
   mov  ebx, 1
   mov  ecx, msg
   mov  edx, len
   int  80h      ;print a message

exit:
   mov  eax, 1
   xor  ebx, ebx
   int  80h

section .data
msg     db  "Allocated 16 kb of memory!", 10
len     equ $ - msg

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

Allocated 16 kb of memory!