彙編 - 記憶體管理



核心提供了 sys_brk() 系統呼叫,以分配記憶體而無需稍後移動。此呼叫在記憶體中將應用程式映像後面的記憶體分配為正確的記憶體。此係統函式允許您設定資料部分中可用的最高地址。

此係統呼叫將一個引數作為引數,該引數是需要設定的最高記憶體地址。此值儲存在 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!
廣告