第 2 章
2-8 頁
錯誤修正:0x08 代表 JEQ 改為 0x08 代表 LDI。
原先內容:
OP 欄是指令代碼, 座落在 31-24 位元, 例如 0x00 代表 LD、0x01 代表 ST、
0x08 代表 JEQ、0x13 代表 ADD 等。這些代碼可以用來提供 CPU 判斷指令類型,
以便執行對應的動作。
更正結果:
OP 欄是指令代碼, 座落在 31-24 位元, 例如 0x00 代表 LD、0x01 代表 ST、
0x08 代表 LDI、0x13 代表 ADD 等。這些代碼可以用來提供 CPU 判斷指令類型,
以便執行對應的動作。
2-9 頁
錯誤修正:Cx 常數暫 24 個位元 => 改為 Cx 常數佔 24 個位元
原先內容:
J 型指令的格式為 OP Cx, 像是 JMP 100 則代表向前跳躍 100 個記憶體位址,
也就是讓程式計數器 PC = PC+100。在 J 型指令當中, 由於 Cx 常數暫 24 個位元,
因此跳躍範圍限制在 -223 ~ 223-1 之間, 大約是前後 8MB 的距離範圍,…
更正結果:
J 型指令的格式為 OP Cx, 像是 JMP 100 則代表向前跳躍 100 個記憶體位址,
也就是讓程式計數器 PC = PC+100。在 J 型指令當中, 由於 Cx 常數佔 24 個位元,
因此跳躍範圍限制在 -223 ~ 223-1 之間, 大約是前後 8MB 的距離範圍,…
2-32 頁
錯誤修正:習題 2.5 語句尚未結束就切斷了。
原先內容:2.5 請問 CPU0 有哪些暫存器?並說明
更正結果:2.5 請問 CPU0 有哪些暫存器?並說明這些暫存器的功能。
第 3 章
3-5 頁
錯誤修正:範例 3.7 (a) 的組合語言程式,i: RESW 1 改為 i:WORD 1
原先內容:
...
EXIT: RET
i: RESW 1
sum: WORD 0
更正結果:
...
EXIT: RET
i: WORD 1
sum: WORD 0
3-6 頁
錯誤修正:範例 3.8 (a), (b) 的程式,不需要宣告 i 變數 (沒用到),因此可將 LD R1, i , i: WORD 0, R1=i, int i=0 等語句刪除。
3-9 頁
錯誤修正:範例 3.10 (c) 的 C 語言程式
(1) i<=100 改為 i<100
(2) a[i] = b[i] 改為 b[i] = a[i]
原先內容:
int a[100], b[100];
int i;
for (i=0; i<=100; i++)
a[i] = b[i];
更正結果:
int a[100], b[100];
int i;
for (i=0; i<100; i++)
b[i] = a[i];
3-10 頁
錯誤修正:圖 3.8 中的 (1) 28 改為 2C。
原先內容:(1) PC = PC+4; 在指令擷取之後 PC 從 28 變為 32。
更正結果:(1) PC = PC+4; 在指令擷取之後 PC 從 28 變為 2C。
3-24 頁:習題 3.6
錯誤修正:IA32 沒有暫存器 R1、R2,應改為 EAX, EBX。
原先內容:
3.6 請寫出一個 IA32 的組合語言副程式 swap, 可以將暫存器 R1 與 R2 的內容交換。
更正結果:
3.6 請寫出一個 IA32 的組合語言副程式 swap, 可以將暫存器 EAX 與 EBX 的內容交換。
3-24 頁:習題 3.7
錯誤修正:IA32 沒有暫存器 R1、R2,應改為 EAX, EBX。
原先內容:
3.7 請寫出一個 IA32 的組合語言副程式 isPrime, 可以判斷暫存器 R2 當中的值是否為質數,
如果是就將 R1 設為 1 傳回, 否則就將 R1 設為 0。
更正結果:
3.7 請寫出一個 IA32 的組合語言副程式 isPrime, 可以判斷暫存器 EBX 當中的值是否為質數,
如果是就將 EAX 設為 1 傳回, 否則就將 EAX 設為 0。
第 5 章
5-28 頁
錯誤修正 1:範例 5.12 說明的最後兩個 StackFunc.o 改為 StackMain.o 與 Stack.exe
原先內容:更正結果:
錯誤修正 2:在製作靜態函式庫一段的內文中,gcc 指令的 -I 參數應該改為 -L 參數。
原先內容:gcc -o stack StackMain.c -lstack -I .
更正結果:gcc -o stack StackMain.c -lstack -L .
(本錯誤由金大學生「趙永禾」提供)
第 7 章
7-15 頁
錯誤修正:rec-x 改為 rec->x
原先內容:
C 語言的基本單元由圖 7.10的基本算式 primary-exp 與
後置算式 postfix_exp 所構成,像是 x, 35, "hello! ", x[3],
f(x), f(), rec.x, rec-x, x++, x— 等,這兩個算式是所有
結構的基礎,因此被我們稱為基本單元。
更正結果:
C 語言的基本單元由圖 7.10的基本算式 primary-exp 與
後置算式 postfix_exp 所構成,像是 x, 35, "hello! ", x[3],
f(x), f(), rec.x, rec->x, x++, x— 等,這兩個算式是所有
結構的基礎,因此被我們稱為基本單元。
7-18 頁
錯誤修正:if (i0) 改為 if (i>0),if (ab) 改為 if (a>b)
原先內容:
C 語言包含 if 與 switch 等兩種分支指令,if 指令較為簡單,像是
if (i0) x=i; 這樣的指令就是一個簡單的範例,if 指令還可以
跟著 else,形成像 if(ab) x=a; else x=b; 這樣的結構。
更正結果:
C 語言包含 if 與 switch 等兩種分支指令,if 指令較為簡單,像是
if (i>0) x=i; 這樣的指令就是一個簡單的範例,if 指令還可以
跟著 else,形成像 if(a>b) x=a; else x=b; 這樣的結構。
7-24 頁
錯誤修正:範例 7.2 第 37-41 行註解
原先內容:更正結果:
第 8 章
錯誤修正:所有的「語義」一詞都統一改為「語意」。
第 10 章
10-36 頁
錯誤修正:Slab 記憶體配置器一段中,去除「然後分配個 Slab 配置器」這句話。
原先內容:
假如要分配一個大小為 30 bytes 的物件時, Slab 會先向
Buddy 系統要求取得一個最小的分頁 (大小為 4KB), 然後分配個 Slab
配置器。然後 Slab 配置器會保留一些位元以記錄配置資訊, 然後將剩下
的空間均分為大小 30 的物件。
更正結果:
假如要分配一個大小為 30 bytes 的物件時, Slab 會先向
Buddy 系統要求取得一個最小的分頁 (大小為 4KB)。
然後 Slab 配置器會保留一些位元以記錄配置資訊, 然後將剩下
的空間均分為大小 30 的物件。
第 11 章
11-9 頁
錯誤修正:LDB R1, [0x3F] 必須改為 LDI R1, 0x3F
原先內容:更正結果:
11-27 頁
錯誤修正:必須在進入主程式前,先以 LDI R12, 0x00 允許中斷。
原先內容:更正結果:
第 12 章
12-42 頁
錯誤修正:IF 的語法有錯誤,請修改為新語法
原先內容:
12.5 請為 C0 語言加上 if 條件的規則為 IF = 'if' '(' COND ')' BLOCK (' elseif' BLOCK)* (else BLOCK)?,
然後修改本章的剖析器程式, 加入可以處理該規則的程式。
更正結果:
12.5 請為 C0 語言加上 if 條件的規則為 IF = 'if' '(' COND ')' BASE ( 'elseif' '(' COND ')' BASE)*
('else' BASE)?, 然後修改本章的剖析器程式, 加入可以處理該規則的程式。
P.2-26, FIG. 2.18 , should the content of PC be 0000001C instead of 00000018?
您好,
按系統程式書裏2-15 頁所述 " I /T 二位元設為 0 時, CPU0 會禁止軟硬體中斷" ,但在錯誤修正裏 (如下):
11-27 頁
錯誤修正:必須在進入主程式前,先以 LDI R12, 0x00 允許中斷。
讓 I/T 二位元為0 卻變成允許中斷,請告知原因為何,感謝
Post preview:
Close preview