Pcode生成
P-code 語言是一種棧式機的語言铃芦。此類棧式機沒有累加器和通用寄存器,有一個棧式存儲器襟雷,有四個控制寄存器(指令寄存器 I刃滓,指令地址寄存器 P,棧頂寄存器 T和基址寄存器 B)耸弄,算術(shù)邏輯運算都在棧頂進(jìn)行咧虎。
Pcode的指令格式為:
F :操作碼
L :層次差 (標(biāo)識符引用層減去定義層)
A :不同的指令含義不同
對于不同的Pcode指令,各指令含義如下:
指令 | 具體含義 |
---|---|
LIT 0, a | 取常量a放到數(shù)據(jù)棧棧頂 |
OPR 0, a | 執(zhí)行運算计呈,a表示執(zhí)行何種運算(+ - * /) |
LOD l, a | 取變量放到數(shù)據(jù)棧棧頂(相對地址為a,層次差為l) |
STO l, a | 將數(shù)據(jù)棧棧頂內(nèi)容存入變量(相對地址為a,層次差為l) |
CAL l, a | 調(diào)用過程(入口指令地址為a,層次差為l) |
INT 0, a | 數(shù)據(jù)棧棧頂指針增加a |
JMP 0, a | 無條件轉(zhuǎn)移到指令地址a |
JPC 0, a | 條件轉(zhuǎn)移到指令地址a |
OPR 0 0 | 過程調(diào)用結(jié)束后,返回調(diào)用點并退棧 |
OPR 0 1 | 棧頂元素取反 |
OPR 0 2 | 次棧頂與棧頂相加砰诵,退兩個棧元素,結(jié)果值進(jìn)棧 |
OPR 0 3 | 次棧頂減去棧頂捌显,退兩個棧元素茁彭,結(jié)果值進(jìn)棧 |
OPR 0 4 | 次棧頂乘以棧頂,退兩個棧元素扶歪,結(jié)果值進(jìn)棧 |
OPR 0 5 | 次棧頂除以棧頂理肺,退兩個棧元素,結(jié)果值進(jìn)棧 |
OPR 0 6 | 棧頂元素的奇偶判斷善镰,結(jié)果值在棧頂 |
OPR 0 7 | |
OPR 0 8 | 次棧頂與棧頂是否相等妹萨,退兩個棧元素,結(jié)果值進(jìn)棧 |
OPR 0 9 | 次棧頂與棧頂是否不等炫欺,退兩個棧元素乎完,結(jié)果值進(jìn)棧 |
OPR 0 10 | 次棧頂是否小于棧頂,退兩個棧元素品洛,結(jié)果值進(jìn)棧 |
OPR 0 11 | 次棧頂是否大于等于棧頂树姨,退兩個棧元素,結(jié)果值進(jìn)棧 |
OPR 0 12 | 次棧頂是否大于棧頂毫别,退兩個棧元素娃弓,結(jié)果值進(jìn)棧 |
OPR 0 13 | 次棧頂是否小于等于棧頂典格,退兩個棧元素岛宦,結(jié)果值進(jìn)棧 |
OPR 0 14 | 棧頂值輸出至屏幕 |
OPR 0 15 | 屏幕輸出換行 |
OPR 0 16 | 從命令行讀入一個輸入置于棧頂 |
根據(jù)Pcode指令的相關(guān)含義,在語法分析的同時填入Pcode耍缴。
地址回填
在Pcode生成中砾肺,地址回填是最難也是最重要的部分挽霉。對于不同的代碼,我們采取不同的地址回填策略变汪。
- if-then語句的目標(biāo)代碼生成模式
if <condition> then <statement>
[if]
<condition>
JPC addr1
<statement>
addr1:
- If-then-else語句的目標(biāo)代碼生成模式:
if <condition> then <statement>[else]
[if]
<condition>
JPC addr1
<statement>
JMP addr2
addr1: [else]
<statement>
addr2
- while-do語句的目標(biāo)代碼生成模式:
while <condition> do <statement>
[while]
addr2: <condition>
JPC addr3
<statement>
JPC addr2
addr3:
- repeat-until語句的目標(biāo)代碼生成模式:
repeat <statement> until <condition>
[repeat]
addr4: <statement>
[until]
<condition>
JPC addr4