graph TB
Pass1-->InitLC["LC := 0"]
InitLC-->ReadToken["字句読み取り"]
ReadToken-->SearchPseudoOpTable["疑似命令を検索"]
SearchPseudoOpTable-->IsPsedoOp{"疑似命令か?"}
IsPsedoOp--No-->SearchMachineOpTable["オペコードを検索"]
SearchMachineOpTable-->SetL["L := 機械語のサイズ"]
SetL-->ProcessLit["リテラルテーブルを処理"]
IsPsedoOp--Yes-->WhichOne["疑似命令処理へ"]
WhichOne--DS/DC/DB/DW/DD-->AdjLC["LCを正しいサイズに調整"]
AdjLC-->SetLWithDT["L := データフィールドのサイズ"]
SetLWithDT-->IsThereLabel
WhichOne--EQ/EQU-->EvalOp["オペランドを評価"]
EvalOp-->UpdSym["シンボルテーブルのラベルのレコードに値を設定"]
UpdSym-->ReadToken
WhichOne--START/ORG-->ChgLC["LCを変更"]
ChgLC-->ReadToken
WhichOne--END-->EvalEnd["リテラルを処理"]
EvalEnd-->RewindAndNext["構文解析してるならばASTを巻き戻してPass2へ"]
RewindAndNext-->Complete(("完了"))
ProcessLit-->IsThereLabel{"ラベルが存在するか?"}
IsThereLabel--No-->IncLC["LC := LC + L"]
IsThereLabel--Yes-->UpdLC["シンボルテーブルのラベルのレコードに現在のLCを設定"]
UpdLC-->IncLC
IncLC-->ReadToken
Last active
February 23, 2023 04:21
-
-
Save hangingman/b1fa7598976e753d59e24599040903dc to your computer and use it in GitHub Desktop.
Pass1 Assembly
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
symbol tableにアドレスを入れるタイミングとその処理
entry:
のようなラベルがあった場合JMP entry
のようにforward referenceしている場合残った問題
アセンブラの実装において
JMP entry
のようなラベルジャンプの構文があったとする、このときアセンブラの内部実装にてLOCをinstructionのsizeで更新しなければなりません
しかし、JMP命令は
JMP rel8
JMP rel32
の2種類の可能性があり、
アセンブラを構文解析した時点ではJMPが0xEBなのか0xE9なのか指定はありません
これをどのように判定すべきか?
結論
-127 <= symbol_table["entry"]に格納した値 <= 127
であれば0xEB、そうでなければ0xE9であると判定するようにする