Two-pass SIC Asssembler
๐pass 1(SYMBOL ์ ์)
- ํ๋ก๊ทธ๋จ๋ด์ ๋ชจ๋ ๋ฌธ์ ์ฃผ์๋ฅผ ๋ฐฐ์ ํ๋ค.(LOCCTR)
- ํจ์ค 2์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ ๋ ์ด๋ธ์ ๋ฐฐ์ ๋ ์ฃผ์ ๊ฐ๋ค์ ์ ์ฅํ๋ค.(SYMTAB)
- ์ด์ ๋ธ๋ฌ ์ง์์๋ค์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ํํ๋ค.(BYTE, RESW ๋ฑ์ ์ํ ์ฌ ์ ์๋๋ ๋ฐ์ดํ ์์ญ์ ๊ธธ์ด ๊ฒฐ์ ๊ณผ ๊ฐ์ ์ฃผ์๋ฐฐ์ ์ ์ํฅ์ ์ฃผ๋ ์ฒ๋ฆฌ๋ฅผ ํฌํจ ํ๋ค.:ํจ์๋ก ์ฒ๋ฆฌ)
๐pass 2(๋ช ๋ น์ด๋ฅผ ๋ฒ์ญํ๊ณ ๋ชฉ์ ํ๋ก๊ทธ๋จ ์์ฑ)
- ๋ช ๋ น์ด๋ฅผ ์ด์ ๋ธํ๋ค.(์ฐ์ฐ์ ์ฝ๋๋ฅผ ๋ฒ์ญํ๊ณ ์ฃผ์๋ฅผ ์กฐ์ฌ ํจ.:OPTAB,SYMTABํ์)
- BYTE, WORD ๋ฑ์ผ๋ก ์ ์๋๋ ๋ฐ์ดํ ๊ฐ์ ์์ฑํ๋ค.(pass2์ ์ง์์ ์ฒ๋ฆฌ ์ ์์ฑ)
- ํจ์ค 1๋์์ ์ด๋ฃจ์ด์ง์ง ์๋ ์ด์ ๋ธ๋ฌ ์ง์์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.(ํจ์์ฒ๋ฆฌ-if๋ฌธ ์ฌ ์ฉํ์ฌ ์ง์์๋ง๋ค ๊ฐ๊ฐ์ ์ฒ๋ฆฌ)
- ๋ชฉ์ ํ๋ก๊ทธ๋จ๊ณผ ์ด์ ๋ธ๋ฌ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
- SYMTAB: ๋ฐฐ์ด ๊ตฌ์กฐ์ฒด
- LOCCTR: ๋ฐฐ์ด ๊ตฌ์กฐ์ฒด
- OPTAB: ๋ฐฐ์ด ๊ตฌ์กฐ์ฒด
- OPTAB ํ์: ์์ฐจ ํ์(for๋ฌธ,while ์ด์ฉ)
- SYMTAB ํ์: ์์ฐจ ํ์(๋จ, ์ด๋๋ ์ฑ ๋ชจ๋๋ก โX"๊ฐ ๋ถ์์๊ฒฝ์ฐ โX"๋ฅผ ์ง์ด๋ค.)
- ์ธ๋ฑ์ค ์ฃผ์์ง์ ๋ฐฉ์-ํ๋๊ทธ ๋นํธ X: ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌ๋ฅผ ์ ์๋ก ์ฒ๋ฆฌํ์ฌ ๊ณ์ฐ
- ์ง์ ์ฃผ์์ง์ ๋ฐฉ์
pass1์์ ์ง์์๋ฅผ ํ์ธํ์ฌ ์ฃผ์๋ฐฐ์ ํ ์ง์์ ๋ชจ๋ ์ฒ๋ฆฌ. BYTE๋ Type์ด C ์ผ ๊ฒฝ์ฐ์ X์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ๋ชฉ์ ์ฝ๋ ์์ฑ, WORD๋ 10์ง์๋ฅผ 16์ง์๋ก ๋ณํ ํ ๋ชฉ์ ์ฝ๋ ์์ฑ, RESB์ RESW๋ ๋ฐ์ดํฐ ์์ฑ ์์ด ๋ฉ๋ชจ๋ฆฌ ์์ฝ.
6) ์ด์ ๋ธ๋ฆฌ ํ๋ก๊ทธ๋จ์ ๋ํ ์ต์ข ์ฐ์ถ๋ฌผ์ธ ํ๋ก๊ทธ๋จ Object Program์ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ชฉ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋ง๋ ํ, ๋ชฉ์ ํ๋ก๊ทธ๋จ ์์ฑ ํจ์์ H๋ ์ฝ๋, T๋ ์ฝ ํธ, E๋ ์ฝ๋ ์ฐจ๋ก๋๋ก ์์ฑํ๋ค.
void pass1(FILE*fp,LINES*Lines,OPTAB*Optab,OBJECT*Object,SYMTAB*Symtab,LOCTAB*Loctab);
//Tokenizing, check_lines, Locctr ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
void pass2(LINES*Lines,OBJECT*Object,SYMTAB*Symtab,LOCTAB*Loctab);
//check_address,mkObjectcode,mkObjectprogram ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
void Tokenizing(FILE *fp,LINES *Lines);
//์ด์
๋ธ๋ฌ ํ
์คํธ ํ์ผ์ ์ฝ์ด ํ ์ค ๋น ๋๊ฐ ํน์ ์ธ๊ฐ์ ํ ํฐ์
//Line[์ค].token1,Line[์ค].token2,Line[์ค].token3์ ์ ์ฅํฉ๋๋ค.
void check_lines(LINES *Lines,OPTAB *Optab,OBJECT *Object,SYMTAB*Symtab);
//1)Lines๋ง๋ค ํ ํฐ๋ค์ ์ฒดํฌํฉ๋๋ค.
//2)์ด๋ค i๋ฒ์งธ ์ค์ ํ ํฐ์ด Optab[j].name๊ณผ ๊ฐ๋ค๋ฉด Object[i].opcode์ Optab[j].opcode๋ฅผ ์ ์ฅํ๊ณ ,
//3)๊ฐ์ง ์๋ค๋ฉด ์ง์์ด์ธ์ง ํ๋ณํฉ๋๋ค. ๋ง์ฝ ์ง์์ด๋ผ๋ฉด ์ง์์ด๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ Loctab.[i].Loc_countLines์ ์ ์ฅํฉ๋๋ค. ์ด๋, BYTE๊ฑฐ๋ WORD๋ผ๋ฉด OPCODE๋ฅผ ์์ฑํฉ๋๋ค.
//4)์ด๋ค ํ ํฐ์ด ๋ช
๋ น์ด, ์ง์์ด ๋ ๋ค ์๋๋ผ๋ฉด , Symtab.Label์ ์ ์ฅํฉ๋๋ค.
void Locctr(LINES *Lines,LOCTAB *Loctab);
//์ด๋ค i๋ฒ์งธ ์ค์ด๋ผ๋ฉด,
//Loctab[i].Loc=Loctab[i-1]+Loctab[i-1].Loc_count์
๋๋ค.(๋จ, ๊ฐ ์ง์์๊ฐ ๊ฐ์ง๋ ๋ฉ๋ชจ๋ฆฌํฌ๊ธฐ(Loctab[i].Loc_count) ์ฒ๋ฆฌ๋ check_linesํจ์์์ ์ด๋ฏธ ํ์์ต๋๋ค.)
void check_address(LINES *Lines,OBJECT *Object,SYMTAB*Symtab,LOCTAB*Loctab);
//ํผ์ฐ์ฐ์(token2๋ token3)๋ฅผ ์ฝ๊ณ ,
//1)์ด๋๋ ์ฑ ๋ชจ๋์ผ ๊ฒฝ์ฐ,2)์ด๋๋ ์ฑ ๋ชจ๋๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋ Symtab์์ ์ฃผ์๋ฅผ ์ฐพ์ Object.adress์ ์ ์ฅํ ์ฃผ์๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ์์ต๋๋ค.
void mkObjectcode(LINES*Lines,OBJECT*Object);
//Object.opcode์ Object.address๋ฅผ strcatํ์ฌ ๋ชฉ์ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
void mkObjectprogram(LOCTAB*Loctab,LINES*Lines,OBJECT*Object);
//ํค๋ ๋ ์ฝ๋: Lines์ ๊ธธ์ด๋ฅผ ์ฌ์ ํ๋ก๊ทธ๋จ์ ๊ธธ์ด๋ฅผ ๊ตฌํ์์ต๋๋ค.
//ํ
์คํธ ๋ ์ฝ๋: ๋ชฉ์ ์ฝ๋ ์์์ฃผ์, ๋ชฉ์ ์ฝ๋ ๊ธธ์ด, ๋ชฉ์ ์ฝ๋ ๋ฅผ ๊ตฌํ์์ต๋๋ค.
//์๋ ๋ ์ฝ๋