汇编 - 内存段
我们已经讨论了汇编程序的三个部分。这些部分也代表着不同的内存段。
有趣的是,如果你用 `segment` 关键字替换 `section` 关键字,你会得到相同的结果。尝试以下代码:
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!
内存段
分段内存模型将系统内存划分为由段寄存器中指针引用的独立段组。每个段用于包含特定类型的数据。一个段用于包含指令代码,另一个段存储数据元素,第三个段保持程序栈。
根据以上讨论,我们可以指定各种内存段如下:
数据段 − 它由.data段和.bss段表示。.data段用于声明内存区域,程序的数据元素存储在此区域。在声明数据元素后,此段无法扩展,并且在整个程序中保持静态。
.bss段也是一个静态内存段,它包含用于稍后在程序中声明数据的缓冲区。此缓冲区内存被清零。
代码段 − 它由.text段表示。这定义了一个存储指令代码的内存区域。这也是一个固定区域。
堆栈 − 此段包含传递给程序中函数和过程的数据值。
广告