bss段 和 暫存器

2021-05-22 08:16:19 字數 3163 閱讀 4936

乙個程式本質上都是由 bss段、data段、text段三個組成的。這樣的概念,不知道最初**於**的規定,但在當前的計算機程式設計中是很重要的乙個基本概念。而且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元占用空間大小的問題。

在採用段式記憶體管理的架構中(比如intel的80x86系統),bss段(block started by symbol segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域 ,一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。在c語言之類的程式編譯完成之後,已初始化的全域性變數儲存在.data 段中,未初始化的全域性變數儲存在.bss 段中 。

在《programming ground up》裡對.bss的解釋為:there is another section called the .bss. this section is like the data section, except that

it doesn』t take up space in the executable.

text和data段都在可執行檔案中(在嵌入式系統裡一般是固化在映象檔案中),由系統從可執行檔案中載入;而bss段不在可執行檔案中,由系統初始化。

暫存器一般分為以下幾類

4個資料暫存器(eax、ebx、ecx和edx)

2個變址和指標暫存器(esi和edi) 2個指標暫存器(esp和ebp)

6個段暫存器(es、cs、ss、ds、fs和gs)

1個指令指標暫存器(eip) 1個標誌暫存器(eflags)

①資料暫存器

ax稱為累加器(accumulator),用累加器進行的操作可能需要更少時間。累加器可用於乘、除、輸入/輸出等操作,它們的使用頻率很高;

bx稱為基位址暫存器(base register)。它可作為儲存器指標來使用;

cx稱為計數暫存器(count register)。在迴圈和字串操作時,要用它來控制迴圈次數;在位操作中,當移多位時,要用cl來指明移位的位數;

dx稱為資料暫存器(data register)。在進行乘、除運算時,它可作為預設的運算元參與運算,也可用於存放i/o的埠位址。

在16位cpu中,ax、bx、cx和dx不能作為基址和變址暫存器來存放儲存單元的位址,但在32位cpu中,其32位暫存器eax、ebx、ecx和edx不僅可傳送資料、暫存資料儲存算術邏輯運算結果,而且也可作為指標暫存器,所以,這些32位暫存器更具有通用性。

②變址和指標暫存器(esi和edi)

暫存器esi、edi、si和di統稱為變址暫存器(index register),主要用於存放儲存單元在段內的偏移量 , 通過它們可實現多種儲存器運算元的定址方式,為以不同的位址形式訪問儲存單元提供方便。作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果 。 它們可作一般的儲存器指標使用。在字串操作指令的執行過程中,對它們有特定的要求,且具有特殊的功能

③指標暫存器(esp和ebp)

32位cpu有2個32位通用暫存器ebp和esp。其低16位對應先前cpu中的sbp和sp,對低16位資料的訪問,不影響高16位的資料。

暫存器ebp、esp、bp和sp稱為指標暫存器(pointer register),主要用於存放堆疊內儲存單元的偏移量,用它們可實現多種儲存器運算元的定址方式,為以不同的位址形式訪問儲存單元提供方便。

作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果。

它們主要用於訪問堆疊內的儲存單元,並且規定:

bp為基指標(base pointer)暫存器,用它可直接訪問堆疊 中的資料;

sp為堆疊指標(stack pointer)暫存器,用它只可訪問棧頂 。

④段暫存器(es、cs、ss、ds、fs和gs)

cs——**段 暫存器(code segment register),其值為**段的段值;

ds——資料段 暫存器(data segment register),其值為資料段的段值;

es——附加段暫存器(extra segment register),其值為附加資料段的段值;

ss——堆疊段 暫存器(stack segment register),其值為堆疊段的段值;

fs——附加段暫存器(extra segment register),其值為附加資料段的段值;

gs——附加段暫存器(extra segment register),其值為附加資料段的段值。

在16位cpu系統中,它只有4個段暫存器.在32位微機系統中,它有6個段暫存器.

32位cpu有兩個不同的工作方式:實方式和保護方式。在每種方式下,段暫存器的作用是不同的。有關規定簡單描述如下:

實方式: 前4個段暫存器cs、ds、es和ss與先前cpu中的所對應的段暫存器的含義完全一致,記憶體單元的邏輯位址仍為「段值:偏移量」的形式。為訪問某記憶體段內的資料,必須使用該段暫存器和儲存單元的偏移量。

保護方式: 在此方式下,情況要複雜得多,裝入段暫存器的不再是段值,而是稱為「選擇子」(selector)的某個值 。

注:這裡特別提供fs暫存器的偏移說明

fs暫存器指向當前活動執行緒的teb結構(執行緒結構)

偏移 說明

000 指向seh鏈指標

004 執行緒堆疊頂部

008 執行緒堆疊底部

00c subsystemtib

010 fiberdata

014 arbitraryuserpointer

018 fs段暫存器在記憶體中的映象位址

020 程序pid

024 執行緒id

02c 指向執行緒區域性儲存指標

030 peb結構位址(程序結構)

034 上個錯誤號

舉例:pop dword ptr fs:[004]

這個句指令的意思就是將堆疊頂部的4個位元組的字元彈棧出去!

⑤指令指標暫存器(eip)

32位cpu把指令指標擴充套件到32位,並記作eip,eip的低16位與先前cpu中的ip作用相同。

指令指標eip、ip(instruction pointer)是存放下次將要執行的指令在**段的偏移量。在具有預取指令功能的系統中,下次要執行的指令通常已被預取到指令佇列中,除非發生轉移情況。所以,在理解它們的功能時,不考慮存在指令佇列的情況。

在實方式下,由於每個段的最大範圍為64k,所以,eip中的高16位肯定都為0,此時,相當於只用其低16位的ip來反映程式中指令的執行次序。

段暫存器和段基址

段暫存器是因為對記憶體的分段管理而設定的。計算機需要對記憶體分段,以分配給不同的程式使用 類似於硬碟分頁 在描述記憶體分段時,需要有如下段的資訊 1.段的大小 2.段的起始位址 3.段的管理屬性 禁止寫入 禁止執行 系統專用等 需要用8個位元組 64位 儲存這些資訊,但段暫存器只有16位,因此段暫存...

01 段暫存器

引言 要學習保護模式中段的機制,首先就要學習段暫存器。首先,我們來看一下下面這段 mov dword ptr ds 0x123456 eax 在上面我們真正讀寫的位址是 ds.base 0x123456 中的ds就是我們這裡要介紹的段暫存器,base是段暫存器中的成員 為了更直觀的了解段暫存器,我們...

彙編2 段暫存器

8086cpu有20根位址線,最大可定址記憶體空間為1mb。而8086的暫存器只有16位,指令指標 ip 和變址暫存器 si di 也是16位的。用16位的位址定址1mb空間是不可能的。所以就要把記憶體分段,保證0000h ffffh 能將整個段尋遍 也就是把1mb空間分為24,即16個段,每段不超...