汇编 - 内存段

我们已经讨论了装配程序的三个部分.这些部分也代表了各种内存段.

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

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!

内存段

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

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

  • 数据段 : 它由 .data 部分和 .bss 表示. .data部分用于声明存储区域,其中为程序存储数据元素.声明数据元素后无法扩展此部分,并且它在整个程序中保持静态.

    .bss部分也是一个静态内存部分,其中包含稍后要声明的数据的缓冲区在该计划中.该缓冲存储器为零填充.

  • 代码段 : 它由 .text 部分表示.这定义了存储器中存储指令代码的区域.这也是一个固定的区域.

  • 堆栈 : 此段包含传递给程序中的函数和过程的数据值.