錯誤更正

第 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

原先內容:
ex5-14original.jpg

更正結果:
ex5-14after.jpg

錯誤修正 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 行註解

原先內容:
ex7-2error.jpg

更正結果:
ex7-2correction.jpg

第 8 章

錯誤修正:所有的「語義」一詞都統一改為「語意」。

ex8-2error.jpg

第 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

原先內容:
ex11-4error.jpg

更正結果:
ex11-4correct.jpg

11-27 頁

錯誤修正:必須在進入主程式前,先以 LDI R12, 0x00 允許中斷。

原先內容:
ex11-23error.jpg

更正結果:
ex11-23correct.jpg

第 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)?, 然後修改本章的剖析器程式, 加入可以處理該規則的程式。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License