Professional Documents
Culture Documents
表一 : Pascal 的簡化語法.
1. <prog> ::= program <pname> var <dec-list> begin <stmt-list> end.
2. <pname> ::=id
3. <dec-list> ::= <dec> | <dec-list>; <dec>
4. <dec> ::= <id-list>
5. <type> ::= integer
6. <id-list> ::= id | <id-list> , id
7. <stmt-list> ::= <stmt> | <stmt-list> ; <stmt>
8. <stmt> ::= <assign>
9. <assign> ::= id := <exp>
10. <exp> ::= <term> | <exp> + <term> | <exp> - <term>
11. <term> ::= <term> | <term> * <factor> | <term> DIV <factor>
12. <factor> ::= id | int
1
92 年上學期 資管科 日間部二年級 系統程式 期末考 出題者 : 陳鍾誠
1. 請說明圖一中的詞彙器 (Tokenizer:Q1) 之功能 (也就是詞彙分析在剖析器中的用途) ?
(10%)
2. 圖一中的剖析器會呼叫詞彙器去取得詞彙 (token)的,請依序列出詞彙的內容與與型態。
(說明 : 圖一中的型態有四種, id[變數], int[整數], keyword[關鍵字] 與 operator[符
號]) (10%)
8. 請將下列 C 語言的二維陣列存取程式碼轉換成四元組的組合語言中間碼,您可參考右半
部的參考中間碼. (10%)
C 語言 參考中間碼
int A[5][3], I=3, J=2; (1) * ? ? ?
A[I][J] = 10; (2) + ? ? ?
(3) := ? ? ?
2
以下演算法是一個編譯器的演算法
String[] compiler(String[] source) {
Tree tree = parse(source); // 剖析
String[] code = codeGenerate(tree); // 產生程式碼
}
9.
10. 請寫出可用來剖析
<exp> ::= <term> | <exp> + <term> | <exp>-<term>
<term> ::= <factor> | <term>*<factor> | <term> div <factor>
<factor> ::= id | int | ( <exp> )
4
92 年上學期 資管科 日間部二年級 系統程式 期中考 出題者 : 陳鍾誠
LDX ZERO
LOOP LDA A, X
ADD B, X
STA C, X
TIX 100
JEQ LOOP
ZERO WORD 0
K100 WORD 100
A RESW 100
B RESW 100
C RESW 100
3.
(a.) 請說明何謂組譯器 (Assembler) (務必說明 Pass1 與 Pass2 的功能與目的各
為何 ?) (10%)
解答
組譯器是用來將組合語言組譯成為目的碼的一種軟體程式,其 Pass1 的功能為計算組合語
言中的符號之位址,並記錄到符號表中,Pass2 則利用該符號表的資訊,配合指令表將組合
語言翻譯成為目的碼。
5
(b.) 請寫出 SIC 組譯器的 Pass 1 演算法。 (10%)
解答
Algorithm Pass1(AssemblyProgram)
address = initial address // 設定初始位址
while not end of AssemblyProgram // 當輸入的組合語言還沒被讀完
read(line) // 讀取下一行組合語言
symbol = symbol(line) // 取得本行中的符號部分
SymbolTable.insert(symbol, address)// 將 (符號, 本行位址) 放入符號表
address = address + sizeof(line) // 計算下一行位址
end while
end
6
(c.) 請寫出 SIC 組譯器的 Pass 2 演算法。 (10%)
解答
Algorithm Pass2(AssemblyProgram)
while not end of AssemblyProgram // 當輸入的組合語言還沒被讀完
read(line) // 讀下一行
binaryCode = translate(line) // 將該行翻譯為二進位
write(binaryCode) into objectFile // 將該二進位碼寫入目的檔
end
end
binary translate(line)
op = op_part(line) // 取得指令部分
opCode = OpTable.find(op) // 將指令部分轉成機器碼
symbol = symbol_part(line) // 取得符號部分
symbolAddress = SymbolTable.find(symbol) // 取得符號位址
if (opCode != null) // 若是一般指令,傳回 指令碼+位址
return opCode+symbolAddress
if (op == RESW) //若是 RESW,傳回
3*length(OPERAND)個 0 位元組
return binarySequence of 00 with length 3*OPERAND
else if (op == RESB) // 若是 RESB,傳回
length(OPERAND)個 0 位元組
return binarySequence of 00 with length 1*OPERAND
else if (op == WORD) // 若是 WORD ,傳回運算元的二進位碼
return binarySequence of OPERAND
else if (op == BYTE) // 若是 BYTE ,傳回運算元字串的二進位
碼
return binarySequence of OPERAND_STRING
else // 否則,無傳回
return nothing
end
7
(d.) 請用上述演算法將第 2 題之組合語言組譯成目的檔 (Object Code),配合圖形
說明你的演算法運作流程 (若你寫不出第 2 題,可用第 1 題代替,但分數會打 8
折) 。 (10%)
解答
5.
(a.)請說明何謂巨集處理器 (Macro Processor) ? (10%)
解答
巨集處理器是將有巨集的組合語言展開成沒有巨集的組合語言的一種軟體程式
8
(b.) 請寫出 SIC 巨集處理器 (Macro Processor) 的演算法。 (10%)
解答
Algorithm MacroProcessor(Input AssemblyProgram, output ResultProgram)
while not end of AssemblyProgram
read(line)
if (isMacroCall(line))
expandText = ExpandMacro(line)
else
output line to ResultProgram
endif
End
9
(c.) 請用上述演算法將下列組合語言展開。 (10%)
COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH &STR1, X
LDCH &STR2, X
TIX &LENGTH
JLT MOVECH
MEND
ZERO WORD 0
.
SWAP COPY S1, TEMP, 3
COPY TEMP, S2, 3
COPY S2, S1, 3
S1 BYTE C'John'
S2 BYTE C'Mary'
TEMP RESB 4
END SWAP
解答
ZERO WORD 0
.SWAP COPY S1, TEMP, 3
.COPY MACRO &STR1, &STR2, &LENGTH
SWAP LDX ZERO
MOVECH LDCH S1, X
LDCH TEMP, X
TIX 3
JLT MOVECH
.COPY TEMP, S2, 3
.COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH TEMP, X
LDCH S2, X
TIX 3
JLT MOVECH
.COPY S2, S1, 3
.COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH S2, X
LDCH S1, X
TIX 3
JLT MOVECH
S1 BYTE C'John'
S2 BYTE C'Mary'
TEMP RESB 4
END SWAP
10