找出系統中的段地址

首先來看一下可執行文件中的段在內存中的佈局:數據結構

 


 

堆棧段:包含一種單一的數據結構---堆棧  函數

堆棧段的主要功能:佈局

1.爲函數內部聲明的局部變量提供存儲空間。spa

2.進行函數調用時,存儲與此有關的一些維護性信息---stack frame ,包括函數的調用地址,不適合裝入寄存器的參數和一些寄存器值的保存。code

3.用做暫時存儲區。blog


 

BBS(Block Started by Symbol)段:顧名思義,由符號開始的塊,主要保存沒有值的變量。內存


 

數據段:包含通過初始化的全局和靜態變量以及它們的值。io


文本段:包括程序的指令。class


1、首先來查看下堆棧段的大概地址:基礎

 

#include  < stdio.h >
 
int  main()
 {
  
int  i;
  printf(
" The stack top is near %p\n " , & i);

 
return   0 ;
 }

 

 

獲得結果:

 

2、接着,找出BBS段的地址:

 

#include  < stdio.h >
 
int  i;                            //未初始化的全局變量
 
int  main()
 {


  printf(
" The BBS Segment top is near %p\n " , & i);

 
return   0 ;
 }

 

 

獲得以下地址:

 

 

3、再找出數據段的段地址:

 

#include  < stdio.h >
 
int  i = 10 ;        // 初始化的全局變量
  int  main()
 {


  printf(
" The DATA Segment top is near %p\n " , & i);

 
return   0 ;
 }

 

 

結果以下:

4、最後找出文本段的地址:

 

#include  < stdio.h >
 #include 
< malloc.h >
 
int  main()
 {
  
int  i = 10 , * b;
  b
= ( int * )malloc( sizeof (i));

  printf(
" The TEXT Segment top is near %p\n " , & malloc);          // malloc指令地址

 
return   0 ;
 }

 

 

結果:

 

咱們在第一步的基礎上,聲明更多的局部變量,看看堆棧段的地址變化狀況:

 

 #include  < stdio.h >

 
int  main()
 {
  
int  i = 10 ,a;


  printf(
" The Stack top is near %p\n " , & a);

 
return   0 ;
 }

 

這裏,在堆棧中壓入一個int 型的局部變量a,結果地址變化以下:

 

和一中的圖比較,發現棧頂地址由 0240FF24變到0240FF20  減小四個字節(正好爲一個int 型的長度)這也能夠看出,堆棧

在絕大多數的處理器中是向下增加的,朝着低地址的方向生長。

相關文章
相關標籤/搜索