彙編 - 記憶體段



我們已經討論了彙編程式的三個部分。這些部分也代表著不同的記憶體段。

有趣的是,如果你用 `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段表示。這定義了一個儲存指令程式碼的記憶體區域。這也是一個固定區域。

  • 堆疊 − 此段包含傳遞給程式中函式和過程的資料值。

廣告