一個程序本質上都是由 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) spa
①數據寄存器.net
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) blog
32位CPU有2個32位通用寄存器EBP和ESP。其低16位對應先前CPU中的BP和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),其值爲數據段的段值;
SS——堆棧段 寄存器(Stack Segment Register),其值爲堆棧段的段值;
ES——附加段寄存器(Extra 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、運算結果標誌位
一、進位標誌CF(Carry Flag)
進位標誌CF主要用來反映運算是否產生進位或借位。若是運算結果的最高位產生了一個進位或借位,那麼,其值爲1,不然其值爲0。
使用該標誌位的狀況有:多字(字節)數的加減運算,無符號數的大小比較運算,移位操做,字(字節)之間移位,專門改變CF值的指令等。
二、奇偶標誌PF(Parity Flag)
奇偶標誌PF用於反映運算結果中「1」的個數的奇偶性。若是「1」的個數爲偶數,則PF的值爲1,不然其值爲0。
利用PF可進行奇偶校驗檢查,或產生奇偶校驗位。在數據傳送過程當中,爲了提供傳送的可靠性,若是採用奇偶校驗的方法,就可以使用該標誌位。
三、輔助進位標誌AF(Auxiliary Carry Flag)
在發生下列狀況時,輔助進位標誌AF的值被置爲1,不然其值爲0:
(1)、在字操做時,發生低字節向高字節進位或借位時;
(2)、在字節操做時,發生低4位向高4位進位或借位時。
對以上6個運算結果標誌位,在通常編程狀況下,標誌位CF、ZF、SF和OF的使用頻率較高,而標誌位PF和AF的使用頻率較低。
四、零標誌ZF(Zero Flag)
零標誌ZF用來反映運算結果是否爲0。若是運算結果爲0,則其值爲1,不然其值爲0。在判斷運算結果是否爲0時,可以使用此標誌位。
五、符號標誌SF(Sign Flag)
符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數採用補碼錶示法,因此,SF也就反映運算結果的正負號。運算結果爲正數時,SF的值爲0,不然其值爲1。
六、溢出標誌OF(Overflow Flag)
溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。若是運算結果超過當前運算位數所能表示的範圍,則稱爲溢出,OF的值被置爲1,不然,OF的值被清爲0。
「溢出」和「進位」是兩個不一樣含義的概念,不要混淆。若是不太清楚的話,請查閱《計算機組成原理》課程中的有關章節。
2、狀態控制標誌位
狀態控制標誌位是用來控制CPU操做的,它們要經過專門的指令才能使之發生改變。
一、追蹤標誌TF(Trap Flag)
當追蹤標誌TF被置爲1時,CPU進入單步執行方式,即每執行一條指令,產生一個單步中斷請求。這種方式主要用於程序的調試。
指令系統中沒有專門的指令來改變標誌位TF的值,但程序員可用其它辦法來改變其值。
二、中斷容許標誌IF(Interrupt-enable Flag)
中斷容許標誌IF是用來決定CPU是否響應CPU外部的可屏蔽中斷髮出的中斷請求。但無論該標誌爲什麼值,CPU都必須響應CPU外部的不可屏蔽中斷所發出的中斷請求,以及CPU內部產生的中斷請求。具體規定以下:
(1)、當IF=1時,CPU能夠響應CPU外部的可屏蔽中斷髮出的中斷請求;
(2)、當IF=0時,CPU不響應CPU外部的可屏蔽中斷髮出的中斷請求。
CPU的指令系統中也有專門的指令來改變標誌位IF的值。
三、方向標誌DF(Direction Flag)
方向標誌DF用來決定在串操做指令執行時有關指針寄存器發生調整的方向。具體規定在第5.2.11節——字符串操做指令——中給出。在微機的指令系統中,還提供了專門的指令來改變標誌位DF的值。
3、32位標誌寄存器增長的標誌位
一、I/O特權標誌IOPL(I/O Privilege Level)
I/O特權標誌用兩位二進制位來表示,也稱爲I/O特權級字段。該字段指定了要求執行I/O指令的特權級。若是當前的特權級別在數值上小於等於IOPL的值,那麼,該I/O指令可執行,不然將發生一個保護異常。
二、嵌套任務標誌NT(Nested Task)
嵌套任務標誌NT用來控制中斷返回指令IRET的執行。具體規定以下:
(1)、當NT=0,用堆棧中保存的值恢復EFLAGS、CS和EIP,執行常規的中斷返回操做;
(2)、當NT=1,經過任務轉換實現中斷返回。
三、重啓動標誌RF(Restart Flag)
重啓動標誌RF用來控制是否接受調試故障。規定:RF=0時,表示「接受」調試故障,不然拒絕之。在成功執行完一條指令後,處理機把RF置爲0,當接受到一個非調試故障時,處理機就把它置爲1。
四、虛擬8086方式標誌VM(Virtual 8086 Mode)若是該標誌的值爲1,則表示處理機處於虛擬的8086方式下的工做狀態,不然,處理機處於通常保護方式下的工做狀態。