forked from ccccourse/sp110b
-
Notifications
You must be signed in to change notification settings - Fork 0
week4 0309
Uriel58 edited this page Jun 11, 2022
·
3 revisions
- 將高階語言轉換成組合語言(或機器碼)的工具
-
代表C語言第0版的意思.就是小型的C語言。
-
只包含for迴圈與基本計算
-
星號代表重複零次以上
-
加號+代表重複一次以上
-
問號?代表重複0或1次
-
詞彙掃描(Scan或Lexical Analysis)
- 將整個程式分成一個一個的基本詞彙(token)
- 以正規表達式進行
- 整數
- number = [0-9]+
- 名稱
- id = [ A-Za-z_ ] [A-Za-z0-9_]
- 整數
-
語法剖析(Parsing或Syntax Analysis)
- 剖析器利用語法規則進行比對,以逐步建立語法樹
- 剖析器
- 由上而下的剖析法 (遞逗下降法、LL法)
- 由下而上的剖析法(運算子優先矩陣法、LR法)
-
語意分析(Semantic Analysis)
- 為語法樹加註節點型態,並檢查型態是否相容,然後輸出語意樹
- 執行時機
- 當語法樹建立完成後,緊接著通常會進行語意分析的動作。
- 執行動作
- 語意分析必須確定每個節點的型態,並且檢查這些型態是否可以相容,然後才輸出具有標記的語法樹,也就是語意樹。
-
中間碼產生(Pcode Generator)
-
語意樹被轉換成中間碼
-
演算法
-
規則:STMT =id '=' EXP
-
範例:sum=sum+i
-
呼叫 generate(exp):其中的exp為sum + i
-
pcode 一行會產生=T0 sum
-
傳回T0作為sum=sum+i運算式的值
-
-
-
使用時機
- 一旦語意樹建立完成,我們就可以利用程式將樹中的每個節點,展開為中間碼
-
方法
- 利用遞迴的方式,從根節點開始,遞迴的展開每個子節點,直到所有節點的中間碼都產生完畢為止。
-
-
最佳化(Optimization)
- 考慮暫存器的配置問題,降低指令數量,增加效率
-
組合語言產生(Assembly Code Generator)
- 將中間碼轉換為組合語言輸出
-
時機
- 一旦中間碼產生完畢,程式就可以輕易的將中間碼轉換成組合語言。
-
方法
- 將中間碼指令轉為組合語言指令
- 必須考慮佔存器的載入與儲存
-
範例:
sum i T0
⇩
LD R1 sum
LD R2 i
ADD R3 R1 R2
ST R3 T0
- 對常數值的載入指令改寫為LDI
- C語言→(剖析)→generic法樹→(產生)→gimple中間碼→(語意分析)RTL中間碼→(最佳化)→(組合語言產生)→組合語言
- 高階語言→(掃描)→詞彙串列→(剖析)→語法樹→(語意分析)→語意樹→(中間碼產生)→中間碼→(組合語言產生)→組合語言→(組譯器)→目的檔「機器碼」
- 指令:加上-dr參數,可gcc輸出rtl中間碼
gcc exp0var.c
./a.out '(x+3)-y'
ASSIGN = id '=' E;
判斷=就吃掉
指令 | 意義 |
---|---|
OPEN | open |
READ | read |
CLOS | close |
PRTF | printf |
MALC | malloc |
FREE | free |
MSET | memset |
MCMP | memcmp |
指令 | 意義 | |
---|---|---|
LEA | load local address | 載入區域變數 |
IMM | load global addressor immediate | 載入全域數或立即值 |
JMP | jump | 躍躍指令 |
JSR | jump to subroutine | 跳到副程式 |
BZ | branch if zero | if (a==0) goto m[pc] |
BNZ | branch if not zero | if (a!=0) goto m[pc] |
ENT | enter subroutine | 進入副程式 |
ADJ | stack adjust | 調整堆疊 |
LEV | leave subroutine | 離開副程式 |
LI | load int | 載入整數 |
LC | load char | 載入字元 |
SI | store int | 儲存整數 |
SC | store char | 儲存字元 |
PSH | push | 推入堆疊 |
OR | a = a OR pop | pop代表從中取出一個元素 |
XOR | a = a XOR pop | |
AND | a = a AND pop | |
EQ | a = a EQ pop | |
NE | a = a NE pop | |
LT | a = a LT pop | |
GT | a = a GT pop | |
LE | a = a LE pop | |
GE | a = a GE pop | |
SHL | a = a SHL pop | |
SHR | a = a SHR pop | |
ADD | a = a ADD pop | |
SUB | a = a SUB pop | |
MUL | a = a MUL pop | |
DIV | a = a DIV pop | |
MOD | a = a MOD pop | |
EXIT | 終止離開 |