汇编语言 内存管理

内核提供 sys_brk() 系统调用,用于分配内存,而无需稍后移动内存。此调用在内存中应用程序映像的正后方分配内存。此系统功能允许您设置数据段中的最高可用地址。

此系统调用采用一个参数,这是需要设置的最高内存地址。该值存储在 EBX 寄存器中。

如果出现任何错误,sys_brk() 返回 -1 或返回负错误代码本身。下面的实例演示了动态内存分配。


实例

以下程序使用 sys_brk() 系统调用分配 16kb 内存:

  1. section .text
  2. global _start ;必须声明才能使用 gcc
  3. _start: ;告诉链接器入口点
  4. mov eax, 45 ;sys_brk
  5. xor ebx, ebx
  6. int 80h
  7. add eax, 16384 ;要保留的字节数
  8. mov ebx, eax
  9. mov eax, 45 ;sys_brk
  10. int 80h
  11. cmp eax, 0
  12. jl exit ;exit, if error
  13. mov edi, eax ;EDI = highest available address
  14. sub edi, 4 ;pointing to the last DWORD
  15. mov ecx, 4096 ;number of DWORDs allocated
  16. xor eax, eax ;clear eax
  17. std ;backward
  18. rep stosd ;repete for entire allocated area
  19. cld ;put DF flag to normal state
  20. mov eax, 4
  21. mov ebx, 1
  22. mov ecx, msg
  23. mov edx, len
  24. int 80h ;打印消息
  25. exit:
  26. mov eax, 1
  27. xor ebx, ebx
  28. int 80h
  29. section .data
  30. msg db "Allocated 16 kb of memory!", 10
  31. len equ $ - msg

结果如下:

  1. Allocated 16 kb of memory!