系統程式
作者:陳鍾誠 著 書號:F7501 定價:480 元 附件:附1片光碟片 出版:旗標出版社 網站:http://sp1.wikidot.com ISBN:978-957-442-827-4 |
![]() |
第 1 章 系統軟體 第 2 章 電腦的硬體結構 第 3 章 組合語言 第 4 章 組譯器 第 5 章 連結與載入 第 6 章 巨集處理器 第 7 章 高階語言 第 8 章 編譯器 第 9 章 虛擬機器 第 10 章 作業系統 第 11 章 嵌入式系統 第 12 章 系統軟體實作 |
簡介
系統程式的教科書已經 20 年沒有改變, 理論與實務已經完全脫節, 如果您需要一本理論清楚、卻又深入實務的教科書, 現在, 您已經找到了:
- 在理論上, 以簡化後的處理器, 降低組合語言的複雜度, 提升學習成效。
- 在程式上, 採用 C 語言實作出組譯器、虛擬機與編譯器, 以程式印證理論。
- 在產業上, 採用 gcc、make、Dev C++ 等工具, 讓學生熟悉系統軟體的操作。
本書網站 http://sp1.wikidot.com 內有豐富的補充教材, 歡迎上網閱讀!
章節目錄
第 1 章 系統軟體
1.1 何謂系統程式?
1.2 系統程式與系統軟體
1.3 本書的章節架構
1.4 實務案例:Dev C++開發環境
1.5 實務案例:GNU 開發工具
第 2 章 電腦的硬體結構
2.1 CPU0 處理器
2.2 CPU0 的指令集
2.3 CPU0 的運作原理
2.4 CPU0 的程式執行
2.5 實務案例:IA32 處理器
第 3 章 組合語言
3.1 基本範例
3.2 陣列存取
3.3 副程式呼叫
3.4 進階語法
3.5 實務案例:IA32的組合語言
第 4 章 組譯器
4.1 組譯器簡介
4.2 組譯器的演算法
4.3 完整的組譯範例
4.4 實務案例:處理器IA32上的GNU組譯器
第 5 章 連結與載入
5.1 簡介
5.2 目的檔
5.3 連結器
5.4 載入器
5.5 動態連結
5.6 實務案例:GNU連結工具
5.7 實務案例:目的檔格式 – a.out
5.8 實務案例:Linux 的動態載入技術
第 6 章 巨集處理器
6.1 組合語言的巨集
6.2 巨集處理的演算法
6.3 實務案例:C語言的巨集
第 7 章 高階語言
7.1 簡介
7.2 語法理論
7.3 語義理論
7.4 執行環境
7.5 實務案例:C語言的語法、語義與執行環境
第 8 章 編譯器
8.1 簡介
8.2 詞彙掃描
8.3 語法剖析
8.4 語義分析
8.5 中間碼產生
8.6 組合語言產生
8.7 最佳化
8.8 實務案例:gcc編譯器
第 9 章 虛擬機器
9.1 簡介
9.2 中間碼
9.3 CPU0 的虛擬機
9.4 實務案例:Java的 JVM 虛擬機
9.5 實務案例:微軟的 Virtual PC 虛擬機
第 10 章 作業系統
10.1 簡介
10.2 行程管理
10.3 記憶體管理
10.4 檔案與輸出入
10.5 實務案例:Linux作業系統
第 11 章 嵌入式系統
11.1 輸出入
11.2 驅動程式
11.3 輪詢機制
11.4 中斷機制
11.5 啟動程式
11.6 系統整合
11.7 實務案例:新華Creator S3C2410 實驗板
第 12 章 系統軟體實作
12.1 簡介
12.2 組譯器實作
12.3 虛擬機實作
12.4 剖析器實作
12.5 編譯器實作
12.6 整合測試
page revision: 13, last edited: 24 Jul 2010 03:44
作者竭誠的歡迎任何人留言!
陳老師您好, 拜讀您的大作後開始了C的學習, 然而目前遇到2個疑問是關於記憶體位址和所佔用大小, 懇請解惑, 程式如下
#include <stdio.h>;
int main() {
//整數變數, 佔用4byte
int a = 0;
//倍精度浮點數, 佔用8byte
double b = 0;
//輸出大小後, 各顯示4與8, 這部分沒問題
printf("大小:\n int: %d\n double: %d\n", sizeof(a), sizeof(b));
//輸出a與b的位址
//問題1: 在我的機器上測試, a的位址是22FF44, b的位址是22FF38, 為何a顯示的位址數字大於b?(經查證, 是因為x86採用little endian, 所以順序顛倒, 但不知其所以然)
//問題2: 為何b被定址為與a相差12的位址? 我認為宣告int a佔用了4byte, 表示在a定址後經過了4byte才又定址b, 所以b應該被定址為22FF40, 難道是傳說中的隨機存取機制???)
printf("位址:\n a: %X\n b: %X\n", &a, &b);
system("pause");
return 0;
}
問題1:
在你的機器上測試 那些區域變數的位址是由OS處理的虛擬位址
a的位址大於b的位址 是因為a和b是區域變數 執行時期是使用到記憶體的stack部份
而stack是由高位址往低位址 在陳老師的系統程式書裡P5-19圖5.14(a)
所以a的位址大於b的位址
至於你說的little endian是指資料放進記憶體的順序 應該和你問的問題無關
問題2:
通常是由OS處理看它想要安排什麼樣的位址
想要連續位址 可以對Compiler做設定對齊位址 或是 使用陣列或結構 等…
但我猜是因為你用64Bits的OS+64Bits的CPU
以上我說的不一定全對
只是就我所知道的給你參考
有錯的話還請給予指正
謝謝
麻煩陳老師幫我刪除這篇多打的留言
謝謝
Hi to all, how is everything, I think every one is getting more from this site, and your views dekddkkekdebeegd
Very nice site!
Very nice site!
Post preview:
Close preview