我們已經(jīng)討論了匯編程序的三個(gè)部分。這些部分代表不同的內(nèi)存段。
有趣的是,如果更換部分關(guān)鍵字段,會(huì)得到相同的結(jié)果。試試下面的代碼:
segment .text ;code segment global _start ;must be declared for linker _start: ;tell linker entry yiibai 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
上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:
Hello, world!
分段存儲(chǔ)模型的系統(tǒng)內(nèi)存劃分成獨(dú)立的段,引用指針位于段寄存器組。每個(gè)段是指包含特定類型的數(shù)據(jù)。一個(gè)段被用于包含指令代碼,另一個(gè)段存儲(chǔ)的數(shù)據(jù)元素,和第三個(gè)分部保持程序堆棧。
根據(jù)上面的討論,我們可以指定不同的內(nèi)存段:
數(shù)據(jù)段 - 它由數(shù)據(jù)段的和bss段。數(shù)據(jù)段的用來聲明數(shù)據(jù)元素的存儲(chǔ)程序的內(nèi)存區(qū)域。本節(jié)不能擴(kuò)大后的數(shù)據(jù)元素的聲明,并在整個(gè)程序中它仍保持不變。
bbs部分是靜態(tài)內(nèi)存部分,其中包含的緩沖區(qū)進(jìn)行數(shù)據(jù)宣布以后在程序。這個(gè)緩沖存儲(chǔ)器是零填充。
代碼段 - 它表示文字部分。這定義的區(qū)域在存儲(chǔ)器中存儲(chǔ)的指令代碼。這也是一個(gè)固定的區(qū)域。
堆 - 此段包含傳遞給程序的功能和程序內(nèi)的數(shù)據(jù)值。