標籤:
第二篇:認識ISA(Instruction Set Architecture)
重要概念:
- 【ISA】
- 【IA-32】:Intel把32位x86架構的名稱x86-32改稱為IA-32,一種身邊很常見的ISA
- 【記憶體模型】
- 【程序呼叫】
•ISA(Instruction Set Architecture)位於軟體和硬體之間
•硬體的功能通過ISA提供出來
•軟體通過ISA規定的"指令"使用硬體
•ISA規定了:
–可執行檔指令的集合,包括指令格式、操作種類以及每種操作對應的運算元的相應規定;
–指令可以接受的運算元的類型;
–運算元所能存放的寄存器組的結構,包括每個寄存器的名稱、編號、長度和用途;
–運算元所能存放的儲存空間的大小和編址方式;
–運算元在儲存空間存放時按照大端還是小端方式存放;
–指令擷取運算元的方式,即定址方式;
–指令執行過程的控制方式,包括程式計數器、條件碼定義等。
IA-32 規定的幾個方面:
『IA-32是CISC 複雜指令集』
- IA-32支援的資料結構類型和格式
- IA-32的寄存器組織
- IA-32的標誌寄存器
- IA-32的定址方式
- 浮點寄存器棧和多媒體擴充寄存器組
- IA-32 常用指令類型
》 程式的轉換與機器級表示
瞭解進階語言與組合語言、
組合語言與機器語言之間的關係
掌握有關指令格式、
運算元類型、
定址方式、
操作類型等內容
瞭解進階語言來源程式中的語句與機器級代碼之間的對應關係
瞭解複雜資料類型(數組、結構等)的機器級實現
0. IA-32寄存器模型
》 理解電腦是如何工作的
程式由指令組成
程式在執行前:
資料和指令事先存放在儲存空間中,每條指令和每個資料都有地址,指令按序存放,指令由OP、ADDR欄位組成,程式起始地址置PC
(原材料和菜譜都放在廚房外的架子上, 每個架子有編號。媽媽從第5個架上指定菜譜開始做)
開始執行程式:
第一步:根據PC取指令(從5號架上取菜譜)
第二步:指令解碼(看菜譜)
第三步:取運算元(從架上或盤中取原材料)
第四步:指令執行(洗、切、炒等具體操作)
第五步:回寫結果(裝盤或直接送桌)
第六步:修改PC的值(算出下一菜譜所在架子號6=5+1)
繼續執行下一條指令(繼續做下一道菜)
》☆ 記憶體模型
作者註:
『不同語言有不同的記憶體模型。只有掌握了記憶體模型,才算是真正具有了對程式的時間和空間效率進行分析的基本能力。
如編譯性語言C、C++,對它們的分析要結合編譯出的組合語言,同時也要注意作業系統和編譯器對記憶體管理的影響。
至於作業系統和編譯器對記憶體模型產生了何種影響,還需要進一步學習。』
Process virtual address space.
【圖片摘自 CSAPP 3rd】
. Heap.The code and data areas are followed immediately by the run-time heap. Unlike the code and data areas, which are fixed in size once the process begins running, the heap expands and contracts dynamically at run time as a result of calls to C standard library routines such as malloc and free.
堆,用於存放程式動態建立的資料。
. Shared libraries.Near the middle of the address space is an area that holds the code and data for shared libraries such as the C standard library and the math library. The notion of a shared library is a powerful but somewhat difficult concept.
共用儲存區:
靜態儲存區:存放共用資料
. Stack. At the top of the user‘s virtual address space is the user stack that the compiler uses to implement function calls. Like the heap, the user stack expands and contracts dynamically during the execution of the program. In particular, each time we call a function, the stack grows. Each time we return from a function, it contracts.
棧:用於程式調用過程中的資料存放區,局部變數。
. Kernel virtual memory. The kernel is the part of the operating system that is always resident in memory. The top region of the address space is reserved for the kernel. Application programs are not allowed to read or write the contents of this area or to directly call functions defined in the kernel code.
核心虛擬儲存區:作業系統專用儲存區。
》程序呼叫的機器級表示:
每次遞迴調用都會增加一個棧幀,所以空間開銷很大。
》IA-32的寄存器使用約定
調用者儲存寄存器:EAX、EDX、ECX
當過程P調用過程Q時,Q可以直接使用這三個寄存器,不用將它們的值儲存到棧中。如果P在從Q返回後還要用這三個寄存器的話,P應在轉到Q之前先儲存,並在從Q返回後先恢複它們的值再使用。
被調用者儲存寄存器:EBX、ESI、EDI
Q必須先將它們的值儲存到棧中再使用它們,並在返回P之前恢複它們的值。
EBP和ESP分別是幀指標寄存器和棧指標寄存器,分別用來指向當前棧幀的底部和頂部。
》程序呼叫中兩種傳遞參數的方式:
1. 按值傳遞
2. 按地址傳遞
》數組的分配和訪問:
1. 分配到靜態區
全域變數、待用資料
2. 分配在棧中,通過EBP來定位
局部變數、入口參數
》棧楨:
push %ebp
mov %esp,%ebp
每次跳轉都會執行兩跳語句構成棧底(在高地址)。ebp存放的是原ebp值
》 有時間可以去學習一下程式如何對應機器指令,即編譯成組合語言的過程。
》 資料的訪問:
其中2、4沒有訪存操作,明白指標在提高執行效率時的厲害之處了吧。
》 資料的對齊
機器字長為固定的32位或64位。資料按位元組編址,每一次訪問可能會跨越地址。
對齊的目的是:減少訪存次數,提高時間和空間效率。(畢竟資料匯流排每次讀好多個位元組呢!)
> 資料的對齊
x86-64中各類型資料遵循一定的對齊規則,而且更嚴格
x86-64中儲存空間提供者被設計成按8位元組或16位元組為單位進行存取,其對齊規則是,任何K位元組寬的基礎資料型別 (Elementary Data Type)和指標類型資料的起始地址一定是K的倍數
例如int類型佔用4個位元組,地址只能在0,4,8等位置上。
> 對齊:
#pragma pack(n)
•為編譯器指定結構體或類內部的成員變數的對齊。
•當常態範圍(如int型按4位元組、short型按2位元組、float按4位元組)比n大時,按n位元組對齊。
•預設或#pragma pack() ,按常態範圍對齊。
__attribute__((aligned(m)))
•為編譯器指定一個結構體或類或聯合體或一個單獨的變數(對象)的對齊。
•按m位元組對齊(m必須是2的冪次方),且其佔用空間大小也是m的整數倍,以保證在申請連續儲存空間時各元素也按m位元組對齊。
__attribute__((packed))
l不按邊界對齊,稱為緊湊方式。
不同作業系統對齊策略可能有所不同。導致不同的結構聲明順序的記憶體利用效率不同。
Windosws策略:
Linux策略:
{
待補充~~
}
Ps:學習完這些就可以為後邊的緩衝區溢位做好準備了。
我來總結一下:
從以上內容可以看出來,人們做了大量工作去減少訪存次數,提高系統的時間和空間效率。因為相比訪問寄存器,訪問儲存空間的開銷還是很大的。
注意在軟體方面同樣可以採取很多有效措施減少訪存次數。
各種各樣的定址方式也都是為了適應進階語言中的資料類型產生的訪存需要。
轉載請註明出處:http://www.cnblogs.com/learn-to-rock/p/5876337.html
【深入理解電腦系統02】ISA 與記憶體模型