汇编语言 内存段

我们已经讨论了汇编程序的 3 个部分。这些部分也代表各种内存段。

有趣的是,如果将 section 关键字替换为 segment,则会得到相同的结果。尝试以下代码:

  1. segment .text
  2. global _start ;必须为链接器(ld)声明
  3. _start: ;告诉链接器入口点
  4. mov edx,len ;消息长度
  5. mov ecx,msg ;写消息
  6. mov ebx,1 ;文件描述符 (stdout)
  7. mov eax,4 ;系统调用号 (sys_write)
  8. int 0x80 ;调用内核
  9. mov eax,1 ;系统调用号 (sys_exit)
  10. int 0x80 ;调用内核
  11. segment .data
  12. msg db 'Hello, world!', 0xa ;要打印的字符串
  13. len equ $ - msg ;字符串的长度

结果如下:

  1. Hello, world!

内存段

分段存储器模型将系统存储器分为独立的分段组,这些分段由位于分段寄存器中的指针引用。每个段用于包含特定类型的数据。一个段用于包含指令代码,另一段用于存储数据元素,第三段保留程序堆栈。

根据以上讨论,我们可以将各种内存段指定为:

  • 数据段 - 由 .data 段和 .bss 表示。.data 段用于声明存储区,在该存储区中为程序存储了数据元素。声明数据元素后,无法扩展此部分,并且在整个程序中它保持静态。.bss 段也是一个静态内存部分,它包含缓冲区,供稍后在程序中声明的数据使用。这个缓冲区内存是零填充的。
  • 代码段 - 它由 .text 表示。这在内存中定义了一个存储指令代码的区域。这也是一个固定区域。
  • 堆栈 - 该段包含传递给程序中的函数和过程的数据值。